在数据库中以二进制形式插入doc文件。我收到错误字符串或二进制数据将被截断..
我有一个像这样的网页表单
<table>
<tr>
<td>
Select File
</td>
<td>
<asp:FileUpload ID="FileUpload1" runat="server" ToolTip="Select Only Word File" />
</td>
<td>
<asp:Button ID="Button1" runat="server" Text="Upload" onclick="Button1_Click" />
</td>
<td>
<asp:Button ID="Button2" runat="server" Text="View Files"
onclick="Button2_Click" />
</td>
</tr>
用户点击上传时的代码
protected void Button1_Click(object sender, EventArgs e)
{
Label2.Visible = true;
string filePath = FileUpload1.PostedFile.FileName;
string filename1 = Path.GetFileName(filePath);
string ext = Path.GetExtension(filename1);
string type = String.Empty;
if (!FileUpload1.HasFile)
{
Label2.Text = "Please Select File";
}
else
if (FileUpload1.HasFile)
{
try
{
// Added by vithal wadje for Csharp-Corner contribution
switch (ext)
{
case ".doc":
type = "application/word";
break;
case ".docx":
type = "application/word";
break;
}
if (type != String.Empty)
{
connection();
Stream fs = FileUpload1.PostedFile.InputStream;
BinaryReader br = new BinaryReader(fs);
Byte[] bytes = br.ReadBytes((Int32)fs.Length);
query = "insert into test(data)" + " values (@Data)";
com = new SqlCommand(query, con);
com.Parameters.Add("@Data", SqlDbType.VarBinary).Value = bytes;
com.ExecuteNonQuery();
Label2.ForeColor = System.Drawing.Color.Green;
Label2.Text = "Word File Uploaded successfully";
}
else
{
Label2.ForeColor = System.Drawing.Color.Red;
Label2.Text = "Select Only word Files";
}
}
catch (Exception ex)
{
Label2.Text = "Error: " + ex.Message.ToString();
}
}
}
在SQL Server中,我有数据库名称测试表名称test
data varbinary(Max)
我上传的文件包含数据byte[9886].
答案 0 :(得分:0)
此问题是由于我们尝试在大于指定列的最大大小的列中插入值,因此请尝试使用最大数据类型
name Varchar(Max)
type Varchar(Max)
data VarBinary(Max)
在此过程中检查您要插入的其他列。我会特别检查type
列,因为它类似于image/jpeg
,而不仅仅是图像或jpeg。
以下是list of possible content types,以便您可以相应地在ContentType列中创建足够的空间。
答案 1 :(得分:0)
尝试将SQL参数的大小/长度设置为实际的字节长度。
com = new SqlCommand(query, con);
com.Parameters.Add("@Data", SqlDbType.VarBinary, bytes.Length).Value = bytes;
com.ExecuteNonQuery();
或尝试将参数长度设置为-1,以便它由SQLClient转换为varbinary(MAX):
com = new SqlCommand(query, con);
com.Parameters.Add("@Data", SqlDbType.VarBinary, -1).Value = bytes;
com.ExecuteNonQuery();
答案 2 :(得分:0)
虽然您可以使用VarBinary(MAX)
来解决问题,这会将容量增加到约2GB,但这可能不是理想的解决方案。
虽然可以将大量二进制数据存储到SQL数据库中,但您可能不应该这样做。相反,您应该只查看存储对该文件的引用以及其他元数据,并将该文件存储到磁盘上。您最好只使用文件服务器,这样可以避免对SQL服务器造成过高的负担。
如果您希望坚持将文件存储在SQL服务器上,请查看使用VarBinary(MAX)FILESTREAM,然后可以存储更大的文件并更快地移动数据。
此处有更多信息:http://technet.microsoft.com/en-us/library/bb933993(v=sql.105).aspx