【发布时间】:2026-02-22 11:20:03
【问题描述】:
代码查询数据库:
我无法将 PDF 文件保存到我的数据库中,我的数据库存储区域出现了严重问题。
public void ADDWORK(String MAW, string NAMEW, string IDUSER, bool Image,string room, byte[] document,string content,bool donework)
{
String strSql = string.Format("INSERT INTO WORK(IDWORD,NAMEWORk,IDUSER,IMAGES,IDROOM,DOCUMENTS,CONTENT,DONEWORK)VALUES('{0}',N'{1}',N'{2}','{3}',N'{4}',N'{5}',N'{6}',N'{7}')"
, MAW, NAMEW, IDUSER, Image,room,document,content,donework);
db.ExecuteNonQuery(strSql);
}
代码调用函数:
byte[] pdf;
public void UploadFlie(string file)
{
FileStream fileStream = File.OpenRead(file);
byte[] contents = new byte[fileStream.Length];
fileStream.Read(contents, 0, (int)fileStream.Length);
fileStream.Close();
pdf = contents;
}
private void button1_Click(object sender, EventArgs e)
{
UploadFlie(filename);
dg.ADDWORK(idword, textBox1.Text,"1", false,"ROOM1", pdf, richTextBox1.Text, false);
MessageBox.Show("Done!");
}
【问题讨论】:
-
我不得不指出您有一个 SQL 注入漏洞。您正在将任意字符串格式化为 SQL 字符串表达式、
'{0}'等。使用参数。请。 -
为什么要用文件填充非常昂贵的 SQL Server 存储空间(和内存)?这就是文件系统高效(且具有成本效益)所做的事情。使用数据库的资源来填充 PDF 文件似乎......反利润。
-
关于参数化查询的进一步说明...您有一个
byte[] document参数,它将被格式化为'System.Byte[]',这不是一个有效的varbinary 表达式,而且绝对是无论如何,这不是您想要的。参数将保护您免受此类错误的影响。 -
以下内容可能会有所帮助:*.com/questions/66612039/…。如果使用
SqlDbType.VarBinary,请将大小设置为-1。您可以考虑将文件名存储在数据库中,并将实际文件保存在文件系统中。 -
db.ExecuteNonQuery(strSql);建议您在方法之间共享单个SqlCommand对象。不要那样做,您应该在需要时创建SqlConnection和SqlCommand对象,并在使用完毕后立即处理它们。 (using构造将负责自动处理。)这也将使您更容易使用带有SqlParameter 的参数化查询,而不是像您当前尝试那样尝试将值注入查询。
标签: c# sql-server winforms pdf