2013-02-06 41 views
0

我的问题是用SQL Server数据库。如何将大文件存储到SQL Server 2008中并检索所有文件?

我成功地存储数据到SQL Server表在C#中使用此代码:

internal static void SaveAutocadFileOnDataBase(string MapCode, byte[] dataElecMap, string dataElecMapName,byte[] dataCivilMap, string dataCivilMapName, byte[] dataArchiMap, string dataArchiMapName,byte[]dataMechaMap,string dataMechaMapName) 
     { 
      string sqlcommand = string.Concat("INSERT INTO AutoCadFiles VALUES ('", MapCode, "' , ", "cast ('", dataElecMap, "' as varbinary(max)),", " '", dataElecMapName, "' ", " , cast ('", dataCivilMap, "' as varbinary(max)) ,", " '", dataCivilMapName, "' ", " , cast ('", dataArchiMap, "' as varbinary(max)) ,", " '", dataArchiMapName, "' "," , cast ('", dataMechaMap, "' as varbinary(max)) ,", " '", dataMechaMapName, "' ", ")"); ExecuteNonQuery(sqlcommand); 
     } 

,并符合本规则进行检索:

internal static DataTable RetriveMaps(string MapNumber, string MapType) 
    { 
     string s = MapType + "Name"; 
     string SqlCommand = string.Concat("SELECT ", MapType, " , ", s, " FROM AutoCadFiles WHERE MapCode='",MapNumber, "'"); 
     return GetBinaryFiles(SqlCommand); 
    } 

    private static DataTable GetBinaryFiles(string SqlCommand) 
    { 
     SqlConnection SqlConnction = null; 
     DataTable dt = new DataTable(); 
     SqlCommand sqlcom = GetConnection(SqlCommand, ref SqlConnction); 
     SqlDataReader sdldr = sqlcom.ExecuteReader(); 
     dt.Load(sdldr); 
     return dt; 
    } 

我成功地从dataTable中获取文件并将其保存到文件系统。但存储的文件量为0字节

或者13字节比数据库中存储的文件小得多。

+0

阿巴斯,你在这里丢失代码..?你在哪里将它保存到'FileStream' ..? – MethodMan

+2

您应该[在您的代码中阅读如何避免** SQL注入攻击**](http://www.a2zdotnet.com/View.aspx?Id=64#.URKpR2d9uK8)!您目前非常脆弱...... –

+1

“我成功存储了数据”您怎么知道? (这不成功)。你甚至看过文件的内容吗?阅读关于如何做到这一点的教程。 – usr

回答

0

既然你在同一时间检索单行,这个简单的代码会做的工作,为检索数据:

 string fileName; 
     byte[] fileread; 

     SqlCommand command; 
     SqlConnection connection = MyGetSqlConnection(); 

     connection.Open(); 

     command = new SqlCommand("Select dataElecMapName From AutoCadFiles Where MapCode = @MapNumber", connection); 
     command.Parameters.Add("@MapNumber", SqlDbType.Int).Value = MapNumber; 
     fileName = (string)command.ExecuteScalar(); 
     command.Dispose(); 

     command = new SqlCommand("Select dataElecMap From AutoCadFiles Where MapCode = @MapNumber", connection); 
     command.Parameters.Add("@MapNumber", SqlDbType.Int).Value = MapNumber; 

     fileread = (byte[])command.ExecuteScalar(); 

     string tempPath = MyFunc.GetTempDirectory(); 

     FileStream fs = new FileStream(tempPath + fileName, FileMode.Create); 
     fs.Write(fileread, 0, fileread.Length); 

     System.Diagnostics.Process.Start(tempPath + fileName); 

     fs.Close(); 

编辑 使用此代码转换文件:

public static byte[] ConvertFileToBytes(string location, ref string FileName) 
    { 
     FileStream fs = new FileStream(location, FileMode.Open, FileAccess.Read); 

     BinaryReader reader = new BinaryReader(fs); 

     byte[] data = reader.ReadBytes((int)fs.Length); 

     fs.Close(); 
     return data; 
    } 
+0

非常感谢您对我的代码marc_s –

+0

的看法,但这不是我的问题,当我说“我成功地存储了数据”时,我会说这个关于将数据存储在sql usr中的问题谢谢。 –

+0

Cesar Vega询问了很多。测试你的代码。这是好的,但我的问题没有解决。它正好工作我的代码。这是我用于将数据转换为字节数组的代码public static byte [] ConvertFileToBytes(string location,ref string FileName) FileSream fs = new FileStream(location,FileMode.Open,FileAccess.Read); byte [] data = new byte [fs.Length]; fs.Read(data,0,System.Convert.ToInt32(fs.Length)); fs.Close(); 返回数据; } –

相关问题