Имя: Пароль:
IT
 
OFF: MS SQL & .NET CF- возможно ли хранить файлы в таблицах?
0 Masquerade
 
08.05.10
14:07
Есть файл, который должен храниться на сервере и который надо передать на клиента.
Хранится в таблице в столбце varbinary(max)
Весит 4 метра (пока).
На клиенте с установленным соединением считываю через SQLDataReader в массив byte[] и пишу в локальный файл.

Чудеса в том, что один и тот же код работает очень нестабильно. SqlDataReader  не закрывается вообще (SQLExeption),даже с SQlCommand.Cancel(), соот-но - соединение тоже не закрыть.
SQLDataReader.GetBytes() - работает через раз.

Скажите - такой механизм вообще должен работать? 4 метра передать он должен вроде как без проблем..
1 Zeldan
 
08.05.10
15:45
версия SQL и CF?
по идее должно работать...
SqlDataReader  пробовал вручную убивать или переопределять?
2 Masquerade
 
08.05.10
23:58
(1)
Да все распоследнее, с сайта MS.

SqlDataReader - и так и так пробовал прибить - нифига.
Что значит переопределть?

SQLCommand newC = new SQLCommand(запрос,коннект);
SQLDAtaReader newDR = newC.executeReader();
newDr.Read();
*****
newDr.Close() -  ошибка

Если спользую using - то ошибка вылетает на границе выхода using.

newC.Cancel();
newDr.Close(); -- та же ошибка.
3 Masquerade
 
08.05.10
23:59
Дкмал заюзать executeScalar(); - но 4-е метра наверное много для нее...
4 kitt
 
09.05.10
01:04
добро пожаловать в мир Виндовс
5 Zeldan
 
09.05.10
12:00
private static void ReadOrderData(string connectionString)
{
   string queryString =
       "SELECT OrderID, CustomerID FROM dbo.Orders;";

   using (SqlConnection connection =
              new SqlConnection(connectionString))
   {
       SqlCommand command =
           new SqlCommand(queryString, connection);
       connection.Open();

       SqlDataReader reader = command.ExecuteReader();

       // Call Read before accessing data.
       while (reader.Read())
       {
           Console.WriteLine(String.Format("{0}, {1}",
               reader[0], reader[1]));
       }

       // Call Close when done reading.
       reader.Close();
   }
}



пользовался когда-то, в точности как в MSDN (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx)

"To create a SqlDataReader, you must call the ExecuteReader method of the SqlCommand object, instead of directly using a constructor."

Значит делаешь все правильно,покажи ошибку,возможно причина в другом.

Можно попробовать через GetValue переделать(в Note по ссылке)
6 Zeldan
 
09.05.10
12:01
7 Zeldan
 
09.05.10
12:01
(4)к чему этот комментарий?
8 Masquerade
 
09.05.10
14:50
Byte[] blob = null;
           FileStream fs = null;
           String SQl_String = "SELECT Cabs FROM Update_ver WHERE ver='" + SQL_ver + "'";
           SqlCommand  cmd = new SqlCommand(SQl_String,serCon);
           SqlDataReader  sdr = cmd.ExecuteReader();
           sdr.Read();

           blob = new Byte[(sdr.GetBytes(0, 0, null, 0, int.MaxValue))];  //здесь через раз может выдать
                                                                                                                      //ошибку.
           sdr.GetBytes(0, 0, blob, 0, blob.Length);
           sdr.Close(); //Этот код ни разу не сработал.
           serCon.Close();
9 Zeldan
 
09.05.10
15:51
(8) ну блин,с размером лажа
Смотри в документации написано,что GetBytes length возвращает количество максимальных символов,а не прочитанных.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getbytes(VS.71).aspx

написано:

1."length
The maximum length to copy into the buffer."

2."GetBytes returns the number of available bytes in the field"

т.е ты в байтовый массив пытаешся запихнуть значение размером с int

если надо именно такой размер,то пробуй через GetValue в нете полно инфы,и внимательно MSDN.

Чтобы убедиться точно,отлавливай через try ошибку.
10 Zeldan
 
09.05.10
15:53
+(9)http://articles.techrepublic.com.com/5100-10878_11-5766889.html
хотя вот тут и такой код работает,но они весь блок в try запихнули
11 Masquerade
 
09.05.10
18:39
(9)
Небольшой нюанс, дружище. Из твоего же источника:

If you pass a buffer that is a null reference (Nothing in Visual Basic), GetBytes returns the length of the field in bytes.

И второй нюанс - бывает, что этот код работает. Правда - закрыть reader так ни разу и не получилось.
12 Zeldan
 
10.05.10
11:10
(11)Согласен,не заметил.У меня вариантов тогда больше нет,на профильном форуме писал каком-то? типа http://www.gotdotnet.ru/
думаю там быстрее помогут,сам понимаешь)