c# - C# 为 SQL 更新语句获取正确的 filpath 字符串
问题描述
我创建了一个小型 WinForms 应用程序(.Net 4.8、SQL Server 18)。现在我想更新我的数据库中的图片。为此,我创建了这个方法:
public void UpdateBild(string picturepath, int id)
{
string bildupdate = string.Format("UPDATE {0} set bild = (SELECT BulkColumn FROM OPENROWSET(BULK N'@pic', SINGLE_BLOB) AS x) where persid = @id", Klassen.Data.Gettabellenname());
try
{
SqlVerb();
com.CommandText = bildupdate;
com.Parameters.AddWithValue("@pic", picturepath);
com.Parameters.AddWithValue("@id", id);
com.ExecuteNonQuery();
}
catch (SqlException sqex)
{
}
catch (Exception ex)
{
}
finally
{
DBVerbindung.DBVerb.scon.Close();
}
}
图片路径将像从文本框中那样设置:
picturepath = tbDateiPfad.Text;
它将被传递给如下方法:
DBVerbindung.SQLStatements upbild = new DBVerbindung.SQLStatements();
upbild.UpdateBild(picturepath, id);
如果该方法被执行,我会收到错误“找不到图片”。
我认为文件路径存在问题,因为如果我使用文件路径(从目录搜索复制)直接在数据库中执行 UPDATE 语句,它工作正常。
所以你能帮我吗,我如何将文本框中的文件路径以正确的形式传递给 SQL 查询的参数。
解决方案
文件名必须指定为字符串文字而不是参数,OPENROWSET
因此您需要在 SQL 语句字符串中指定该值:
string bildupdate = string.Format("UPDATE {0} set bild = (SELECT BulkColumn FROM OPENROWSET(BULK N'{1}', SINGLE_BLOB) AS x) WHERE persid = @id;", Klassen.Data.Gettabellenname(), picturepath);
try
{
SqlVerb();
com.CommandText = bildupdate;
com.Parameters.Add("@id", SqlDbType.Int).Value = id;
com.ExecuteNonQuery();
…
请注意,表名和文件名值必须从受信任的来源获得并经过验证,因为这些值未参数化。另外,避免AddWithValue
.
推荐阅读
- unity3d - 存储数据并通过电子邮件发送数据 - Unity WebGL
- javascript - 我想使用 jest 为带有参数的函数编写测试用例
- python - 我如何将字符串列表(带有附加的元数据,不必匹配)与段落(我屏幕上的所有文本)模糊匹配?
- c# - C#和PHP加密的字符串结果不同,字节相同
- node.js - 使用 node.js 将 XML 3GPP 转换为 csv
- android - 致命异常:com.facebook.react.common.JavascriptException:TypeError:无法将空值转换为对象
- javascript - getHours(),显示和隐藏
- android-emulator - 无法使用 fiddler 从 Android 7 版本的移动应用程序捕获流量
- angular8 - 使用功能模块 Angular 8 时,API 被调用了两次
- linux - 我的 bashrc 包含奇怪的字符(如果 Ä -f ü/.bash_aliases Å; 那么 . ü/.bash_aliases fi)