2011-10-28 99 views
0

我有一个错误,我无法修复...我真的不知道为什么。我正在使用此代码tu上传一个文件在我的数据库中,我想现在使用BLOB。BLOB,插入SQL数据库

if (FileUpload1.HasFile) 
        try 
        { 

         //FileUpload1.SaveAs("C:\\inetpub\\wwwroot\\ClientPortalCs\\" 
         //+ GetTheCurrentDirectory(MyTreeView.SelectedNode) 
         //+ "\\" + FileUpload1.FileName); 
         //LabelFile.Text = "File name: " + 
         //FileUpload1.PostedFile.FileName + "<br>" + 
         //FileUpload1.PostedFile.ContentLength + " kb<br>" + 
         //"Content type: " + FileUpload1.PostedFile.ContentType; 

         dbConnection.Open(); 
         dynamic queryString = ("INSERT INTO Files (Name,Path,UserUpload,Date,Data) VALUES ('" 
         + FileUpload1.FileName + "','" + GetTheCurrentDirectory(MyTreeView.SelectedNode) + "','" + Request.Cookies["UserSettings"]["UserName"] + "','" + DateTime.Now + "','" + FileUpload1.FileBytes + "');" 
         + "SELECT CAST(scope_identity() AS int)"); 

         SqlCommand theCommand1 = new SqlCommand(queryString, dbConnection); 

         int newFid = (Int32)theCommand1.ExecuteScalar(); 

         dynamic queryStringFolder = ("INSERT INTO FILES_FOLDERS (Folder_Id,File_Id) VALUES ('" 
         + MyTreeView.SelectedValue + "'," + "'" + newFid + "')"); 
         theCommand1 = new SqlCommand(queryStringFolder, dbConnection); 

         theCommand1.ExecuteNonQuery(); 

         dbConnection.Close(); 

        } 

在我的数据库中,表格文件中的字段DATA是一个varbinary(max)。 查询中的DATA字段参数是我尝试上传的文件的字节数。

的出错是: “从数据类型为varchar到VARBINARY(最大值)错误隐式转换是不允许使用CONVERT函数来运行此查询。”

有人能告诉我为什么吗?

非常感谢。

+0

这样的代码只是乞讨[SQL注入攻击(http://xkcd.com/327/)。请使用参数化查询。 – GvS

回答

2

我认为,问题在于,您将图像的字节[]作为字符串传递,因为您将它用单引号引起来。

在这里删除单引号:

'" + FileUpload1.FileBytes + "'" 

还有一个建议:使用参数查询。您将免受SQL注入攻击,您的查询可能会运行得更快,您将在未来消除此类错误。

UPDATE - 使用参数:

string queryString = "INSERT INTO Files (Name,Path,UserUpload,Date,Data) VALUES (@Name,@Path,@UserUpload,@Date,@Data)"; 
SqlCommand theCommand1 = new SqlCommand(queryString, dbConnection); 
theCommand1.Parameters.AddWithValue("@Name",FileUpload1.FileName); 
theCommand1.Parameters.AddWithValue("@Path",GetTheCurrentDirectory(MyTreeView.SelectedNode)); 
theCommand1.Parameters.AddWithValue("@UserUpload",Request.Cookies["UserSettings"]["UserName"]); 
theCommand1.Parameters.AddWithValue("@Data",FileUpload1.FileBytes); 
theCommand1.Parameters.AddWithValue("@Date",DateTime.Now); 

int newFid = (Int32)theCommand1.ExecuteScalar(); 
+0

好的!但为什么现在我得到这个错误? 错误对象或列名缺失或为空。对于SELECT INTO语句,请确认每列都有一个名称。对于其他语句,查找空的别名。别名定义为“”或[]是不允许的。将别名更改为有效的名称。 ''附近语法不正确。 – Kiwimoisi

+0

@Emged你现在有一个不正确的语法。打印您发送给SQL Server的sql语句并查看它的外观。 – Icarus

+0

是的.. INSERT INTO文件(名称,路径,UserUpload,日期,数据)VALUES('WSB BOXE 20.jpg','Projects // TEST /','Admin','2011/10/28 12:41 :16 PM',System.Byte []); SELECT CAST(scope_identity()AS int) 它看起来不好.. – Kiwimoisi