【问题标题】:BLOB , Insert SQL Database插入SQL数据库
【发布时间】:2011-10-28 19:55:26
【问题描述】:

我有一个无法修复的错误...我真的不知道为什么。

我正在使用此代码在我的数据库中上传文件,我现在想使用 BLOB。

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(max) 的隐式转换。使用 CONVERT 函数运行此查询。"

谁能告诉我为什么?

非常感谢。

【问题讨论】:

标签: c# asp.net sql blob


【解决方案1】:

我认为,问题在于您将图像的字节 [] 作为字符串传递,因为您将其括在单引号中。

去掉这里的单引号:

'" + FileUpload1.FileBytes + "'"

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

更新 - 使用参数:

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();

【讨论】:

  • 好的!但是为什么我现在得到这个错误?错误 对象或列名丢失或为空。对于 SELECT INTO 语句,验证每一列都有一个名称。对于其他语句,请查找空别名。不允许使用定义为 "" 或 [] 的别名。将别名更改为有效名称。 '' 附近的语法不正确。
  • @Emged 您现在的语法不正确。打印您要发送到 SQL Server 的 sql 语句并查看它的外观。
  • 是 .. 插入文件(名称、路径、用户上传、日期、数据)值('WSB BOXE 20.jpg'、'Projects//TEST/'、'Admin'、'10/ 28/2011 12:41:16 PM', System.Byte[] );SELECT CAST(scope_identity() AS int) 看起来不太好..
  • 我应该能看到数字而不是 System.Byte[] ,对吧?
  • @Emged 我明白了...您像这样在内联 sql 中传递字节数组。改用参数。将在 5 秒内提供一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多