загрузка файла в БД

macros
Дата: 11.01.2010 14:29:16
Решил переписать утилитку по записи файлов на сервер

было для SQLServer:

cmdInsert.Parameters.Add("@name",SqlDbType.VarChar);
cmdInsert.Parameters.Add("@body",SqlDbType.Image);

cmdInsert.CommandText=UpdCmdText;

for (int i=0; i<FilesInfo.Length;i++)
{				
 FileStream fs=new FileStream(dir.FullName+"\\"+FilesInfo[i].ToString(),FileMode.Open,FileAccess.Read);
 BinaryReader br=new BinaryReader(fs);
 Byte[] bFile=br.ReadBytes(Convert.ToInt32(fs.Length));
 cmdInsert.Parameters["@name"].Value=FilesInfo[i].FullName.Remove(0,PathDir.Length+1);
 cmdInsert.Parameters["@body"].Value=bFile;
 cmdInsert.ExecuteNonQuery();
}

переделал для OleDB (хотел сделать универсальную для любой БД):

command.Parameters.Add("@fName", OleDbType.VarChar);
command.Parameters.Add("@fBody", OleDbType.LongVarBinary);

foreach (var file in fileList)
{

 // -- готовим файл
 var br = new BinaryReader(File.Open(dir4Export.FullName + "\\" + file, FileMode.Open,  FileAccess.Read));
 var fileBody = br.ReadBytes((int) file.Length);
        
 // -- готовим параметры
 command.Parameters["@fName"].Value = file.Name;
 command.Parameters["@fBody"].Value = fileBody;
        
 try
 {          
   connection.ConnectionString = ConfigurationManager.ConnectionStrings["DistribDB"].ConnectionString;
   using (connection)
   {
     connection.Open();
     ret = command.ExecuteNonQuery();            
     
    ....


и теперь в БД пишуться "пустые" файлы. ну то есть когда я их потом обратно пытаюсь считать - получается что файлы равны 0кб

в чем ошибка? неправильно выбрал формат типа данных? или что?
Незнание - порождает стремление...
skyANA
Дата: 11.01.2010 14:40:42
Возможно нужно указать размер (size) для параметра типа VarBinary.
HOW TO: Read and Write a File to and from a BLOB Column by Using Chunking in ADO.NET and Visual Basic .NET
macros
Дата: 11.01.2010 15:00:53
skyANA
Возможно нужно указать размер (size) для параметра типа VarBinary.
HOW TO: Read and Write a File to and from a BLOB Column by Using Chunking in ADO.NET and Visual Basic .NET


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

1. испытывал на sql server в таблице до этого тип поля был image я поставил Binary(500)
2. в коде исправил с
 command.Parameters.Add("@fBody", OleDbType.LongVarBinary);
на
 command.Parameters.Add("@fBody", OleDbType.Binary, 500);

теперь полученные при считывании файлы - все по 0,5Кб. Проблема не решена :(
skyANA
Дата: 11.01.2010 15:54:15
macros

1. испытывал на sql server в таблице до этого тип поля был image я поставил Binary(500)
2. в коде исправил с
 command.Parameters.Add("@fBody", OleDbType.LongVarBinary);
на
 command.Parameters.Add("@fBody", OleDbType.Binary, 500);

теперь полученные при считывании файлы - все по 0,5Кб. Проблема не решена :(
Простите, но прежде, чем менять тип поля, следует сначала узнать, что такое Binary(n), а что Image.
1. Оставьте тип image.
2. Размер параметра определяйте по длине массива:
 command.Parameters.Add("@fBody", OleDbType.LongVarBinary, bFile.Length);
Как-то так :)
macros
Дата: 12.01.2010 06:13:30
skyANA,

- неа, все равно не помогает :(
skyANA
Дата: 12.01.2010 08:25:19
macros
- неа, все равно не помогает :(
Статью внимательно прочитали? Там есть ссылка на C# реализацию с примерами для OleDb:
How to read and write a file to or from a BLOB column by using ADO.NET and Visual C# .NET
macros
Дата: 12.01.2010 08:47:26
skyANA
macros
- неа, все равно не помогает :(
Статью внимательно прочитали? Там есть ссылка на C# реализацию с примерами для OleDb:
How to read and write a file to or from a BLOB column by using ADO.NET and Visual C# .NET


- Спасибо, большое, но я уже сам разобрался ))
оказывается у меня в процедуре была ошибка
вот тут

CREATE PROCEDURE [dbo].[insertDistrib]
(
	@fName	VARCHAR(255),
	@fBody	BINARY
)
исправил на

CREATE PROCEDURE [dbo].[insertDistrib]
(
	@fName	VARCHAR(255),
	@fBody	IMAGE
)

и все заработало как при
command.Parameters.Add("@fBody", OleDbType.LongVarBinary);
так и при
command.Parameters.Add("@fBody", OleDbType.Binary);

:)

кому интересно - вот еще удачный пример:
[url=]http://subscribe.ru/archive/comp.soft.prog.dotnetgrains/200507/14180857.html[/url]