首页 > 解决方案 > 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 查询的参数。

标签: c#sqlsql-server

解决方案


文件名必须指定为字符串文字而不是参数,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.


推荐阅读