【问题标题】:Implicit conversion from data type varchar to varbinary(max) is not allowed. Use the CONVERT function to run this query不允许从数据类型 varchar 到 varbinary(max) 的隐式转换。使用 CONVERT 函数运行此查询
【发布时间】:2012-08-15 06:58:59
【问题描述】:

这是表单中我的“保存”按钮中的代码。我正在使用 VB6.0 和 MSSQL Server 2005。

CommonDialog1 & 2 保存插入图片框中的图像的文件名。

Set rs = con.Execute("insert into table1   
values('" & txtbox1.Text & "' , "_  
& " '" & txtbox2.Text & "' , "_     
& " '" & CommonDialog1.FileName & "' , "_    
& " '" & CommonDialog2.FileName & "' , "_  
& " '" & txtbox3.Text & "' )")

“不允许从数据类型 varchar 到 varbinary(max) 的隐式转换。使用 CONVERT 函数运行此查询。” - 运行时弹出错误。

【问题讨论】:

  • Hellloooo SQL 注入。即使使用经典的 VB 和 ADO,您仍然可以使用 Command object,它允许您使用参数化查询。

标签: sql-server-2005 vb6


【解决方案1】:

由于 SQL 的“INSERT”函数不接受子查询,我尝试使用 CAST 转换 CommonDialog1 & 2 的文件名,结果成功。

设置 rs = con.Execute("插入到 table1 values('" & txtbox1.Text & "' , "_
& " '" & txtbox2.Text & "' , "_
& " cast('" & CommonDialog1.FileName & "' as varbinary(max)) , "_
& " cast('" & CommonDialog2.FileName & "' as varbinary(max)), "_

& "'" & txtbox3.Text & "')")

【讨论】:

  • 恭喜。您已将 文件名 存储在 varbinary(max) 列中。但考虑到列定义,我预计它是为了存储文件的实际内容而创建的。
  • 感谢@Damien_The_Unbeliever,但是还有其他方法可以存储文件的实际内容吗?例如将图像直接存储到数据库中。我正在使用此代码获取图像的文件名:'CommonDialog1.showopen'picturebox1。
【解决方案2】:
  1. 使用下面列出的参数为自己创建一个存储过程(可以不用,但我更喜欢这种方法)(我建议重命名它们)
  2. 将 mCmd.CommandText 行替换为您的存储过程名称
  3. 替换连接字符串
  4. 如果任何文本大小有误,请更正参数大小
Dim mConn As New ADODB.Connection
Dim mCmd As New ADODB.Command
Dim mStreamCD1 As New ADODB.Stream
Dim mStreamCD2 As New ADODB.Stream

mStreamCD1.Type = adTypeBinary
mStreamCD1.Open
mStreamCD1.LoadFromFile (CommonDialog1.FileName)

mStreamCD2.Type = adTypeBinary
mStreamCD2.Open
mStreamCD2.LoadFromFile (CommonDialog2.FileName)

mConn.Open "Insert your Connection String"
Set mCmd.ActiveConnection = mConn
mCmd.CommandType = adCmdText

mCmd.CommandText = "InsertIntoTable1"
mCmd.Parameters.Append mCmd.CreateParameter("@txtbox1Text", adVarChar, adParamInput, 250, txtbox1.Text)
mCmd.Parameters.Append mCmd.CreateParameter("@txtbox2Text", adVarChar, adParamInput, 250, txtbox2.Text)
mCmd.Parameters.Append mCmd.CreateParameter("@CD1", adVarBinary, adParamInput, mStreamCD1.Size, mStreamCD1.Read)
mCmd.Parameters.Append mCmd.CreateParameter("@CD2", adVarBinary, adParamInput, mStreamCD2.Size, mStreamCD2.Read)
mCmd.Parameters.Append mCmd.CreateParameter("@txtbox3Text", adVarChar, adParamInput, 250, txtbox3.Text)

mCmd.Execute , , adExecuteNoRecords

【讨论】:

  • 谢谢@SpectralGhost 我会试试这个。
猜你喜欢
  • 2018-06-07
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多