Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Автор: Biblbrox
Дата сообщения: 07.12.2011 09:22
Здравствуйте.
Вопрос от новичка:
Помогите корректно получить дату из Excel. На листе в книге есть столбец F с датами которые нужно считать. Я делаю так

Код: for (i = 2; i <= NumStr; i++)
{
exlCells = exlWorksheet.get_Range("F" + Convert.ToString(i), misValue);
Console.WriteLine(exlCells.Value2);
}
Автор: Mextrom
Дата сообщения: 07.12.2011 11:18
Biblbrox
40882 - это количество дней с 1 января 1900 00:00. Поэтому можно сделать так
Код: for (i = 2; i <= NumStr; i++)
{
exlCells = exlWorksheet.get_Range("F" + Convert.ToString(i), misValue);
Date = new DateTime(1900, 1, 1);
Date = Date.AddDays(Convert.ToDouble(exlCells.Value2));
Console.WriteLine(Date);
}
Автор: AndVGri
Дата сообщения: 07.12.2011 11:38
Biblbrox
Вариант для VB
Dim vDate As DateTime = DateTime.(exlCells)
Автор: Mextrom
Дата сообщения: 07.12.2011 12:00
Biblbrox
Пардон, не прав был, лучше так
Код: for (i = 2; i <= NumStr; i++)
{
exlCells = exlWorksheet.get_Range("F" + Convert.ToString(i), misValue);
Date = DateTime.FromOADate(Convert.ToDouble(exlCells.Value2));
Console.WriteLine(Date);
}
Автор: Biblbrox
Дата сообщения: 07.12.2011 12:12
Mextrom
Спасибо, второй вариант работает. В связи вот с этим:

Цитата:
Правда с вашим значением у меня получилась другая дата - 07.12.2011.

хочу спросить:
У меня в Excel стоит дата 05.12.2011, я ее считал и обработал в C# и затем записал в базу MS SQL сервера. И в таблице сервера как раз получается 07.12.2011. Может быть подскажите в какую сторону копать? Где искать эти 2 дня?
Автор: Mextrom
Дата сообщения: 07.12.2011 13:29
Biblbrox
Какой тип данных в поле таблицы базы данных? Как выгружаете данные в БД. Код есть?
В первом предложенном мною решении дата отсчитывается от 01.01.1900 00:00 (взято здесь), в итоге получилось 07.12.2011. Во втором - метод FromOADate предполагает, что дата отсчитывается от 30.12.1899 00:00 (отсюда), что в итоге преобразуется в 05.12.2011.
Дальше остаётся выяснить, как хранится дата у вас в БД и как передаётся.
Автор: Biblbrox
Дата сообщения: 07.12.2011 13:43
В таблице тип datetime, код который выгружает вот:

Код:
for (i = 2; i <= NumStr; i++)
{
exlCells = exlWorksheet.get_Range("F" + Convert.ToString(i), misValue);
Plat.Datau = DateTime.FromOADate(exlCells.Value2);
SQL = "INSERT INTO dbo.Bux ( Num, Datau)" + "VALUES( '" + Plat.Num + "', " +
Сonvert.ToString(Plat.Datau.ToOADate()) + ")";
command1 = new SqlCommand(SQL, connection1);
command1.Prepare();
command1.ExecuteNonQuery();
}
Автор: andrey777k
Дата сообщения: 07.12.2011 20:29
Добрый вечер(день),программерши и программисты.
Пишу программы,готовлюсь к олимпиаде по программированию.


При работе со строками возникла проблема, помогите пожалуйста.Помогите обработать строку
{"status":0,"id":"4d3606fbf4a34c74ab3239b8580b4d3e-1","hypotheses":[{"utterance":"bla-bla-bla","confidence":0.59976286}]}


Мне нужно вытащить bla-bla-bla , вот написал код который находит позицию соседних с ним элементов и вычисляет длину bla-bla-bla Но при попытке скопировать из строки, нужные мне bla-bla-bla, вылетает ошибка (я наверное неправильно использую функцию CopyTo)

Код: string s = '{"status":0,"id":"4d3606fbf4a34c74ab3239b8580b4d3e-1","hypotheses":[{"utterance":"bla-bla-bla","confidence":0.59976286}]}'
string s1, s2, s3, s4;
char[] s5 = { };
int a, b, c;
s3 = "utterance";
s4 = "confidence";
a = s.IndexOf(s3);
b = s.IndexOf(s4);
c = (b - 3) - (a + 12);
a = a + 12;
s.CopyTo(a,s5,1,c); ТУТ ОШИБКА
richTextBox1.Text = s5.ToString(richTextBox1.Text);
Автор: BlackVetal
Дата сообщения: 08.12.2011 05:23
andrey777k
CopyTo - копирует s в s5, по индексам a,1,c. Так как твоя строка s5 пустая - то и программа матерится.
возможно нужно попробовать substring:
s5 = s.Substring(a,c)
Автор: Mextrom
Дата сообщения: 08.12.2011 07:15
Biblbrox

Цитата:
SQL = "INSERT INTO dbo.Bux ( Num, Datau)" + "VALUES( '" + Plat.Num + "', " +
Сonvert.ToString(Plat.Datau.ToOADate()) + ")";

Здесь проще всего всего написать
Код: SQL = "INSERT INTO dbo.Bux ( Num, Datau)" + "VALUES( '" + Plat.Num + "', " +
Plat.Datau.ToString() + ")";
Автор: dmitriyku
Дата сообщения: 08.12.2011 12:38
Как создать динамический массив byte* и указатель на него выдать внешнему приложению?

Пишу библиотеку dll на C# (.NET), которая подключается к WIN32-приложению.
Требуется сформировать нультерминальную однобайтовую строку в .NET-библиотеке и передать WIN32-приложению. Блок памяти надо освободить уже в WIN32-приложении.

Проблема в том, что не вижу способа в .NET динамически выделить блок памяти, указатель на который можно было бы отдать наружу.

byte[] arr = new byte[10]; не годится, т.к. это создание динамического массива в куче, он будет уничтожен сборщиком мусора (рано или поздно), после выхода из функции, и я не смогу освободить эту память в WIN32-приложении.

byte* arr = stackalloc byte [11]; тоже не годится, т.к. память освободится сразу при выходе из блока, хоть и создается не в куче, а в стеке.


Автор: May_Johnson
Дата сообщения: 09.12.2011 02:08
dmitriyku

Как мне кажется, byte[] arr = new byte[10]; будет работать отлично, потому что куча ведь принадлежит не библиотеке, а процессу.

Вы уже пробовали и получили отрицательный результат?

Если да то попробуйте перед выдачей сохранить ссылку на этот массив где то в статической переменной, тогда сборщик ее точно не тронет.
Автор: dmitriyku
Дата сообщения: 09.12.2011 04:26
Не пробовал, т.к. в учебнике написано, что Сборщик мусора кроме всего занимается оптимизацией кучи, т.е. данные могут в любой момент переехать по другому адресу, а в переменную-указатель запишется новый адрес.
Кроме того, приложение пытается освободить память по указателю после использования, с дотнетом так поступать нельзя, опять же по учебнику.

Попробую как будет на практике.

А вообще думаю уже копать в другую сторону. Поищу способы межпроцессного взаимодействия, например через сокеты, но это коряво.

Добавлено:
Работает.

В библиотеке (C#) создал строку string s = "Привет!";
Перекодировал её в windows-1251.
Записал в byte[] с нулем в конце и указатель выдал наружу.
В WIN32-приложении принял как PChar (delphi), перевел в ansistring и отобразил.
Освобождении памяти под PChar засунул в try except.

В данном случае сработало, но так делать нельзя.

В общем случае надо передавать массивы строк (таблицы) и другие структуры данных (связные списки со строками).
Нет гарантий, что указатели будут указывать куда надо и Сборщик мусора не освободит память до того, как я успею все данные перекачать в дельфийские структуры.
Автор: Sp44
Дата сообщения: 09.12.2011 05:27
Приветствую.

Имеется задача: сделать приложение с многослойной архитектурой, когда DAL живет на сервере, база данных на другом и клиенты само собой живут на своих машинах. Это WinForms. В программе должны быит датагриды и формы для ввода и редактирования информации. Я сделал коммуникацию по TCP/IP и сериализую/десериализую данные. С объектами, которые используются на формах проблем нет. Они маленькие, а вот с датасетами - вроде как есть. Когда я пересылаю примерно 20к записей - посылка распухает до 10Мб. Для локальной сети 100Мб это не самая большая проблема, но вот что происходит с паматью на клиентской машине при сериализации этих датасетов - достаточно страшно. 100 метров сожрать в порядке вещей. Память само собой потом возвращается, но тем не менее скрипит мозгами устрашающе.

Собственно вопрос: как можно пересылать датасеты через сеть чтобы не было тяжолой операции десериализации? Я пробовал как XML сериализацию так и бинарную - разница невелика, только в размере посылки и времени на транспортировку.

Используется .Net 4.0 если это интересно (важно) без WCF (по моему мнению там жуткий оверкилл). Одно из требований - клиент должен быть совершенно независим от типа базы данных.

Спасибо.
Автор: dmitriyku
Дата сообщения: 09.12.2011 10:08
Связный список передать не получается.
Автор: May_Johnson
Дата сообщения: 09.12.2011 17:53
dmitriyku

Наверное вы правы, и решение "в лоб" типа
return new byte[10];
Далеко не лучший вариант.

Мне кажется что лучше будет использовать следующее решение :
1 Реализовать на с++ IStream
http://msdn.microsoft.com/en-us/library/windows/desktop/aa380034%28v=vs.85%29.aspx
2 Передать ссылку на него в C#
3 Записать вашу строку в поток

Таким образом сборщик мусора ничего и знать про эту строку не будет т.к. поток создавала не clr


Также можно не реализовывать его самостоятельно а использовать


Код:
[DllImport("OLE32.DLL")]
static extern int CreateStreamOnHGlobal(int hGlobalMemHandle, bool fDeleteOnRelease, out IStream pOutStm);
Автор: dmitriyku
Дата сообщения: 12.12.2011 05:32
Спасибо, сейчас опробую. Честно говоря, уже подумывал об именованных каналах

Добавлено:
Через поток данные передаются. Можно считать это приемлемым решением.
Автор: Terradine
Дата сообщения: 13.12.2011 08:33
Доброго времени суток, подскажи плз как решить следующую проблемку:
Есть некоторое подобие форума, там список веток формируется динамически, обсуждения разворачиваются по клику на необходимую ветку, для добавления ответа на эту тему необходимо знать какую именно тему выбрал юзер. Использую метод $.post("Default.aspx", { topic: topic}), отправляет значения по клику на кнопку "запостить"; firebug показывает что параметр действительно отправляется, но на сервере получить этот параметр не получается, пробовал получать методом string extension = Request.Form["topic"]; и в page_load и в обработчике клика по кнопке. Вот блин что не так делаю понять не могу, но приходит всегда null, хотя повторюсь что фаербаг показывает что уходит то что надо, заранее спасибо.
Автор: BlackVetal
Дата сообщения: 14.12.2011 06:14
Sp44
Я так понимаю у тебя клиент-серверная версия. Если опять же правильно понял тебя, в твоей программе есть серверная часть, которая обрабатывает запросы клиентов.
Мне непонятно, зачем тебе надо использовать TCP\IP, сериализацию? Написать простой интерфейс - даже через простые датасеты (обычное обращение) - серверная часть уже пусть сама разбирается как и откуда брать данные ...
Еще один момент - так ли нужно передавать 20 тыс записей? не проще дать возможность пользователю настроить фильтр и и выбирать данные согласно условиям пользователя ?
Автор: Mextrom
Дата сообщения: 14.12.2011 08:05
Terradine
А так
Код: string extension = Request["topic"];
Автор: Sp44
Дата сообщения: 14.12.2011 10:04
BlackVetal

Извиняюсь, но я что-то не очень понял как сделать то, что вы предлагаете. Да, мне надо передать содержимое датасета, но через какой механизм его можно передать, если клиент не имеет понятия о том, к какой базе данных идет обращение если вообще идет? Сейчас я дергаю соммуникационный модуль с кодом набора записей напрмер invoices_list с параметром примененного фильтра last3m например. Можете дать краткий пример хотябы на уровне псевдокода плиз или ссылку какую нить?

Про 20к записей - это такое требование от заказчика. Дело в том, что программа по умолчанию показывает документы за несколько последних месяцев. Они это активно используют. В общем это бизнес-требование.
Автор: May_Johnson
Дата сообщения: 15.12.2011 16:59
Sp44

Ну ведь 20К записей не видны пользователю одновременно, сразу отображены навреняка не больше сотни, так что разбейте свои 20К скажем на 10 частей и разбирайте поток по очереди.

Взяли первый кусочек потока, десериализовали скажем 2К записей, почистили память с GC.Collect(), взяли сл. кусочек потока, и т.д.
Автор: BlackVetal
Дата сообщения: 16.12.2011 05:22
Sp44
Извиняюс ... вчера написал ответ ... а отправить забыл ...
Только сейчас понял что вы спрашивали - в тупик поставила фраза о том, что клиент не обязан знать о БД ... НУ да ладно ...
По поводу 20 тыс записей - а так ли заказчику нужны они при начале работы? Требованием, требованием - но зачастую такие требования это возможно недопонимание своей области. Ну ладно, если все же нужны большие объемы, во-первых, обязательно загрузку данных в отдельный поток, во-вторых, загружать кусками - то есть загрузили к примеру 1k записей, как только нужно - подгружаем другую часть, третью и т.д. (в принцепе это уже озвучил May_Johnson)
Автор: Sp44
Дата сообщения: 16.12.2011 07:29
BlackVetal и May_Johnson,

Спасибо за ваше мнение. Эти блин 20к в добавок ко всему еще и упорядочены по возрастанию, фокус после загрузки переводится на нижнюю строку и при этом отрисовываются агрегированные значения.

Вот что я наверное буду делать: внутри посылки буду передавать несколько датасетов по 5к записей в каждом и потом их восстанавливать в один конечный. Расход памяти то идет по нелинейной зависимости и я таким образом смогу сбить нагрузку в ущерб времени. Аможет и уговорю заказчика поменть требования.
Автор: Macht59
Дата сообщения: 18.12.2011 02:17
Привет.
Не могу найти ошибку...
Прошу помочь тех, кто знаком с криптографией, а в частности с алгоритмом AES.

Загвоздка в расширении ключа:


Код:
//byte Nk = 4;
//byte Nr = 10;
//byte Nb = 4;
//uint[] Rcon = { 0x00000000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1b000000, 0x36000000 };
//byte[] ShiftArray = { 24, 16, 8, 0 };
//byte[] ShiftForSubWord = { 28, 20, 12, 4 };
//SBox - большая таблица подстановок.

public class KeyGenerator
{
public KeyGenerator(byte[] key, byte Nk, byte Nr)
{
_Nk = Nk;
_Nr = Nr;
_w = new uint[_Nr*_Nk + Nb];
_w = KeyExpansion(key);
}

private uint[] _w;
private byte _Nk, _Nr;
public uint[] GetW
{
get
{
return _w;
}
}

private uint[] KeyExpansion(byte[] key)
{
uint temp;
for (byte i = 0; i < _Nk; i++)
{
_w[i] = (uint)(key[i * 4] << 24) | (uint)(key[i * 4 + 1] << 16) |
(uint)(key[i * 4 + 2] << 8) | (uint)(key[i * 4 + 3]);
}
for (byte i = _Nk; i < _w.Length; i++)
{
if (i % _Nk != 0)
{
_w[i] = _w[i - 1] ^ _w[i - _Nk];
}
else
{
temp = SubWord(RotWord(_w[i - 1])) ^ Rcon[i / _Nk];
_w[i] = (temp) ^ _w[i - _Nk];
}
}
return _w;
}
private uint SubWord(uint p)
{
uint res = 0;
for (byte i = 0; i < Const.Nb; i++)
res |= (uint)(Const.SBox[(p >> ShiftForSubWord[i]) & 0x0f, (p >> Const.ShiftArray[i]) & 0x0f]) << ShiftArray[i];
return res;
}
private uint RotWord(uint w)
{
return (w << 8) | (w >> 24);
}
}
Автор: dneprcomp
Дата сообщения: 18.12.2011 19:28
Sp44
Агрегированные значения для всех 20 тысячь можно посчитать на сервере и передать с рекордсетом.
Юзеру выдать проследние 5 тысячь и перевести на последнюю строку.
Автор: LuckyStrike
Дата сообщения: 21.12.2011 19:07
в чем ошибка?

double[][] w = new double [classC][compC];

Error: "Не допустимый спецификатор ранга: требуеться , или ]".
Автор: May_Johnson
Дата сообщения: 22.12.2011 06:21
LuckyStrike

Различают 2 понятия
1 Двумерный массив
2 Массив массивов

Несмотря на то что на бумажке они выглядят одинаково, в памяти это будут разные структуры.

Первое инициализируется так :

Код: double[,] w = new double [2,2];
Автор: ComradG
Дата сообщения: 27.12.2011 12:58
насколько я помню, то Dispose для IContainer реализуется как-то так:
Код: protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
components.Dispose();
base.Dispose(disposing);
}
}

private System.ComponentModel.IContainer components = null;
Автор: LuckyStrike
Дата сообщения: 29.12.2011 20:53
д

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

Предыдущая тема: Как удалить/добавить/отключить/включить устройство?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.