2

在下面需要你的帮助。

我有代码检查数据表中是否存在特定行;如果行不存在,那么我将该行添加到数据表中。这工作正常,但是当行值包含特殊字符链接'(单引号)时失败。

下面是代码:

string lastName = dgRow.Cells[2].Text.Replace("amp;", "");
DataRow[] dr = dt.Select("LastName='" + lastName + "'"); //check whether row is available in datatable or not

if (dr.Length <= 0)// Condition to check if row is there in data table
{
    dt.Rows.Add();
    dt.Rows[dt.Rows.Count - 1]["FirstName"] = dgRow.Cells[1].Text;
    dt.Rows[dt.Rows.Count - 1]["LastName"] = dgRow.Cells[2].Text;
    dt.AcceptChanges();
}
return dt; //Return modified data table to calling function.

当 LastName 包含单引号时,此代码将失败。

我需要一个不从姓氏中删除引号的解决方案。

谢谢

4

3 回答 3

5

dt.Select()我强烈建议使用 LINQ,而不是一开始就使用。它避免了整个“在字符串中嵌入查询”问题,这个问题非常可怕,让人联想到 SQL 注入攻击。

所以:

var lastNameToFind = dgRow.Cells[2].Text.Replace("&amp;", "");
var matched = dt.AsEnumerable()
                .Where(dr => dr["LastName"].Equals(lastNameToFind))
                .Any();

if (matched)
{
    DataRow newRow = dt.NewRow();
    dt.Rows.Add(newRow);
    newRow["FirstName"] = dgRow.Cells[1].Text;
    newRow["LastName"] = dgRow.Cells[2].Text;
    dt.AcceptChanges();
}
于 2013-02-07T07:16:33.937 回答
0

尝试改变:

DataRow[] dr = dt.Select("LastName='" + dgRow.Cells[2].Text.Replace
("amp;", "")+ "'");

对此:

DataRow[] dr = dt.Select("LastName='" + dgRow.Cells[2].Text.Replace
("amp;", "").Replace("\'", "\'\'") + "'");

(未经测试)

于 2013-02-07T07:16:21.673 回答
0

您可以将Single Quote替换为Double Quote

Dim LastName As String = Replace(txtLastName.Text, "'", "''")

但这不是一个好习惯......

看看这个:Replaceing apostrophe in asp.net to prevent SQL error

于 2013-02-07T07:24:10.413 回答