2013-02-06 24 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(); 返回數據; } –

相關問題