C# 在SQL Server数据库中更新希伯来文文本的结果是“引用”&引用;

C# 在SQL Server数据库中更新希伯来文文本的结果是“引用”&引用;,c#,sql,database,input,hebrew,C#,Sql,Database,Input,Hebrew,我正在编写一个C#程序,将数据输入SQLServer2008数据库 我使用以下函数将信息输入数据库 public bool AddSupplier(string name, string contactPerson, string telephone, string fax, string type, string payment, string comments) { _cmd.CommandText = "INSERT INTO suppliers (

我正在编写一个C#程序,将数据输入SQLServer2008数据库

我使用以下函数将信息输入数据库

public bool AddSupplier(string name, string contactPerson, string telephone, string fax, string type, string payment, string comments)
{
        _cmd.CommandText =
            "INSERT INTO suppliers (name,contactPerson,telephone,fax,type,payment,active,comments) VALUES (@name,@contactPerson,@telephone,@fax,@type,@payment,@active,@comments);";
        _cmd.Parameters.Clear();
        _cmd.Parameters.AddWithValue("@name", name);
        _cmd.Parameters.AddWithValue("@contactPerson", contactPerson);
        _cmd.Parameters.AddWithValue("@telephone", telephone);
        _cmd.Parameters.AddWithValue("@fax", fax);
        _cmd.Parameters.AddWithValue("@type", type);
        _cmd.Parameters.AddWithValue("@payment", payment);
        _cmd.Parameters.AddWithValue("@active", 1);
        _cmd.Parameters.AddWithValue("@comments", comments);
        _con.Open(); 
        _cmd.ExecuteNonQuery(); 
        _con.Close();
        return true; 
    }
这很好,我可以用希伯来语添加信息,并显示在数据库中

当我尝试使用此函数编辑它时

public bool EditSupplier(int supplierId,string name, string contactPerson, string telephone, string fax, string type, string payment, string comments)
{
        _cmd.CommandText = "UPDATE suppliers SET name='" + name + "' ,contactPerson='" + contactPerson + "',telephone='" + telephone +
                           "',fax='" + fax + "',type='" + type + "',payment='" + payment + "',comments='" + comments +
                           "' WHERE supplierId =" + supplierId + ";";
        _con.Open(); 
        _cmd.ExecuteNonQuery();
        _con.Close();
        return true; 
}

我最终使用的是
而不是希伯来语输入

只要对update命令和insert命令使用参数化SQL即可。无论如何,为了防止SQL注入攻击,您应该这样做,因为它可以更好地处理非ASCII字符

(IIRC,如果确实需要,您可以使用
N'.'
中的文字,但我强烈建议您不要这样做。)


此外,最好在每次使用数据库时创建一个新的连接和命令,并使用
using
语句在正确的时间处理它。不要担心效率方面的问题-内置连接池将处理这个问题。

只需对update命令和insert命令使用参数化SQL即可。无论如何,为了防止SQL注入攻击,您应该这样做,因为它可以更好地处理非ASCII字符

(IIRC,如果确实需要,您可以使用
N'.'
中的文字,但我强烈建议您不要这样做。)


此外,最好在每次使用数据库时创建一个新的连接和命令,并使用
using
语句在正确的时间处理它。不要担心效率方面的问题-内置连接池会处理这个问题。

在传递字符串之前,您必须对字符串进行编码,然后再传递希伯来文字符的正确编码…在传递字符串之前,您必须对字符串进行编码,然后再传递希伯来文字符的正确编码…因此,只需按照我使用insert的相同方式工作即可关于值?@Iakovl:是的,完全正确-诚然,我会使用
cmd.Parameters.Add(“@name”,SqlDbType.VarChar)。Value=name
,而不是使用
AddWithValue
,但这是一个稍微不同的问题。请注意我答案的最后一段。N'…'有助于搜索函数的另一个函数,即。你能解释一下第二段或参考info@Iakovl:我宁愿不要,因为这表明您仍在将值编码到SQL中。在任何地方使用参数化SQL。我不同意第二个建议——为每个命令创建新连接。对于通过LAN与服务器连接的桌面应用程序,这是不必要的,保持开放连接是更好的方法。因此,只要让它以我使用插入值的相同方式工作就可以了?@Iakovl:是的,完全正确-无可否认,我会使用
cmd.Parameters.Add(“@name”,SqlDbType.VarChar).Value=name
而不是使用
AddWithValue
,但这是一个稍微不同的问题。请注意我答案的最后一段。N'…'有助于搜索函数的另一个函数,即。你能解释一下第二段或参考info@Iakovl:我宁愿不要,因为这表明您仍在将值编码到SQL中。在任何地方使用参数化SQL。我不同意第二个建议——为每个命令创建新连接。对于通过LAN与服务器连接的桌面应用程序,这是不必要的,保持开放连接是更好的方法。