我在ASP.NET网站上使用MYSQL。我的SQLS脚本在表的中央。对于更新,我使用以下SQL命令:
更新用户SET active = @ active,short = @ short,userimage = @ userimage,adminunit = @ adminunit,admincc = @ admincc WHERE(id = @ID);
在网站上,我获得了SQL,并用网站上的控件(文本框,复选框,下拉列表...)替换了参数。这对于所有控件都很有效,因为它们始终具有值。但是USERIMAGE是图像,我从文件上传控件中获取信息。只要选择一个文件,它就可以正常工作。
这段代码从控件中读取值并将它们保存在参数列表中:
Case "GET"
If TypeOf control Is TextBox Then myParameterList.Add(New cParameter("@" + sField, CType(control, TextBox).Text))
If TypeOf control Is CheckBox Then myParameterList.Add(New cParameter("@" + sField, CType(control, CheckBox).Checked))
If TypeOf control Is DropDownList Then myParameterList.Add(New cParameter("@" + sField, CType(control, DropDownList).SelectedValue))
If TypeOf control Is Image Then
End If
If TypeOf control Is FileUpload Then
If CType(control, FileUpload).HasFile Then
Dim filename As String = Path.GetFileName(CType(control, FileUpload).PostedFile.FileName)
Dim contentType As String = CType(control, FileUpload).PostedFile.ContentType
Using fs As Stream = CType(control, FileUpload).PostedFile.InputStream
Using br As New BinaryReader(fs)
Dim bytes As Byte() = br.ReadBytes(fs.Length)
myParameterList.Add(New cParameter("@" + sField.Replace("FileUploadControl".ToLower, ""), bytes))
End Using
End Using
End If
End If
这段代码构建了SQL:
With cmd
.Connection = Connection
.CommandType = CommandType.Text
For Each sParameter As cParameter In myParameterList
.Parameters.AddWithValue(sParameter.Name, sParameter.Value)
Next
.CommandText = sSQL
End With
因此,通常SQL如下所示:
UPDATE用户SET active = True,short = testname,userimage = System.Byte [],adminunit = True,admincc = False WHERE(id = 12);
但是,如果未选择任何图像,则SQL如下所示:
UPDATE用户SET active = True,short = testname,userimage = @ userimage,adminunit = True,admincc = False WHERE(id = 12);
在这种情况下,旧映像将丢失并且databasefield userimage为null。任何想法如何优雅地忽略/删除不使用的参数?
谢谢!
最佳答案
固定:将SQL更改为:userimage = IF(@userimage IS NULL,userimage,@userimage)–