SQL Server-FileStream, wie zum Auffüllen des filestream-Spalte
Ich habe es über ein paar verschiedene Methoden für das einfügen von Daten in SQL-Server (FileStream). Was ist die beste Methode für das einfügen des FileStream-Objekte? Der wesentliche Unterschied zwischen den Ansätzen unten, direkt hast einfügen, und die andere in einen Platz-Halter für das FileStream-Objekt.
Ein Ansatz ist, dass er direkt einfügen des Dokuments über C# durch eine insert:
Link: FileStream
con.Open();
string sql = "INSERT INTO MyFsTable VALUES (@fData, @fName, default)";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.Add("@fData", SqlDbType.Image, fileData.Length).Value = fileData;
cmd.Parameters.Add("@fName", SqlDbType.NVarChar).Value = fi.Name;
cmd.ExecuteNonQuery();
con.Close();
Ein weiterer Ansatz Sie eine Zeile eingefügt, aber Links das Dokument (FileStream-Spalte) null. Ich musste in ein dummy-Wert, weil, wenn das FileStream-Spalte null war meine Get File Path Aufruf Null zurück:
Link: FileStream
5: if (FileUpload1.FileContent.Length > 0)
6: {
7: SqlConnection objSqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
8: objSqlCon.Open();
9: SqlTransaction objSqlTran = objSqlCon.BeginTransaction();
10:
11: SqlCommand objSqlCmd = new SqlCommand("FileAdd",objSqlCon,objSqlTran);
12: objSqlCmd.CommandType = CommandType.StoredProcedure;
13:
14: SqlParameter objSqlParam1 = new SqlParameter("@SystemNumber", SqlDbType.Int);
15: objSqlParam1.Value = "1";
16:
17: SqlParameter objSqlParam2 = new SqlParameter("@FileType", SqlDbType.VarChar,4);
18: objSqlParam2.Value = System.IO.Path.GetExtension(FileUpload1.FileName);
19:
20: SqlParameter objSqlParamOutput = new SqlParameter("@filepath", SqlDbType.VarChar, -1);
21: objSqlParamOutput.Direction = ParameterDirection.Output;
22:
23: objSqlCmd.Parameters.Add(objSqlParam2);
24: objSqlCmd.Parameters.Add(objSqlParam1);
25: objSqlCmd.Parameters.Add(objSqlParamOutput);
26:
27:
28: objSqlCmd.ExecuteNonQuery();
29:
30: string Path = objSqlCmd.Parameters["@filepath"].Value.ToString();
31:
32: objSqlCmd = new SqlCommand("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()", objSqlCon, objSqlTran);
33:
34: byte[] objContext = (byte[])objSqlCmd.ExecuteScalar();
35:
36:
37: SqlFileStream objSqlFileStream = new SqlFileStream(Path, objContext, FileAccess.Write);
38:
39: objSqlFileStream.Write(buffer, 0, buffer.Length);
40: objSqlFileStream.Close();
41:
42: objSqlTran.Commit();
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen FILESTREAM-MVC: Download-und Upload-Bilder von SQL Server für ein Beispiel zeigt, wie das hochladen und herunterladen von filestream in eine effiziente, stream-orientierte Art und Weise. Der Ansatz, den Sie verfolgen, zuweisen von einen Puffer der Größe der gesamten Datei hochgeladen (und ich nehme an, Sie tun das gleiche auf Dienste der Inhalt auch) ist sehr ineffizient, Ihre ASP-Prozess-Speicher Schreddern, um Stücke von so großen byte [] - Operationen.