在尝试执行SQL查询(将一个字符串和一个uniqueidentifier分别返回到列0和1)时,我在异常日志中得到“当从字符串转换为uniqueidentifier时转换失败”。如何避免这种情况?我假设问题是,未定义datatables列,因此它期望一个字符串,而SQL正在尝试对其进行转换。记录异常。令我惊讶的是,GUID已成功存储到da [1]。因此,我的程序在技术上可以正常工作,但是我想清除此异常,并且要做到这一点,我需要了解为什么会发生这种情况以及如何解决它。
da = new DataTable();
da.Clear();
...
string invoiceStatusSQL = @"select status,invoice_id from invoices where acct_id='" + accountid + "'";
command = new SqlCommand(invoiceStatusSQL, cnn);
da.Load(command.ExecuteReader());
答案 0 :(得分:1)
您应该始终对SQL查询进行参数设置,以帮助防止SQL注入 并避免出现您现在面临的问题。参见Why do we always prefer using parameters in SQL statements?。
使用SqlParameter
将参数添加到SqlCommand。
string invoiceStatusSQL = @"select status, invoice_id from invoices where acct_id = @accountId";
command = new SqlCommand(invoiceStatusSQL, cnn);
SqlParameter idParam = new SqlParameter("@accountId", accountid);
command.Parameters.Add(idParam);
da.Load(command.ExecuteReader());
您还可以在创建参数时指定实际的数据库类型,这将减少框架可能会错误地推断类型的所有issues(尽管我不认为这种情况会在您的情况下发生) Guid / UniqueIdentifier)。指定类型的一种方法如下所示。
var p = new SqlParameter
{
ParameterName = "@accountId",
SqlDbType = SqlDbType.UniqueIdentifier,
Value = accountid
};