从字符串转换为 uniqueidentifier 时转换失败 - 使用 ExecuteReader 加载 DataTable
Conversion failed when converting from string to uniqueidentifier - loading DataTable with ExecuteReader
在尝试执行 SQL 查询(returns 一个字符串和一个唯一标识符分别到第 0 列和第 1 列)时,我在异常日志中得到 "Conversion failed when converting from a character string to uniqueidentifier"。我怎样才能避免这种情况?我假设问题是,数据表列未定义,因此它需要一个字符串并且 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());
您应该始终参数化您的 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
};
在尝试执行 SQL 查询(returns 一个字符串和一个唯一标识符分别到第 0 列和第 1 列)时,我在异常日志中得到 "Conversion failed when converting from a character string to uniqueidentifier"。我怎样才能避免这种情况?我假设问题是,数据表列未定义,因此它需要一个字符串并且 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());
您应该始终参数化您的 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
};