从字符串转换为uniqueidentifier时转换失败-使用ExecuteReader加载DataTable

时间:2019-12-18 18:26:33

标签: c# sql-server ado.net

在尝试执行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());

1 个答案:

答案 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  
            };