你能说出 SqlDataReader 有什么问题吗,我返回"System.Data.SqlClient.SqlException:"必须声明标量变量"@idorder"



嗨,因为我使用的是 using-语句,我的一次性连接应该在它离开语句后处理,但我的代码在我轮询数据库或获取信息的程序中的其他方法中是硬耦合的。因此,我决定添加conn。Open(( 和 conn.Close(( 以避免超时错误或同时打开多个数据库连接。我不断收到一个我不熟悉的错误,那就是:

System.Data.SqlClient.SqlException: '必须声明标量变量 "@idorder">

它与我的参数相关吗? 我做错了什么?

希望这有助于其他开发人员从 ADO.NET 开始

public List<LogModel> GetLatestLogsOnEachSystemId(
{
List<string> _systemIds = new List<string>();
_systemIds.Add("MA");
_systemIds.Add("MB");
_systemIds.Add("DY");
_systemIds.Add("FA");
using (SqlConnection conn = new SqlConnection(connString))
{
for (int i = 0; i < _systemIds.Count; i++)
{
string systemId = _systemIds[i];
var querystring = "select top 1 * " +
"from dbo.RadarMF30_log " +
"where SYSTEM_ID = @id" +
"order by Log_writing_time desc";

SqlCommand cmd = new SqlCommand(querystring, conn);
conn.Open();
cmd.Parameters.AddWithValue("@id", systemId);
SqlDataReader reader = cmd.ExecuteReader();
conn.Close();
var model = new LogModel
{
errorCode = reader.GetString(0),
errorMsg = reader.GetString(1),
"select top 1 * " +
"from dbo.RadarMF30_log " +
"where SYSTEM_ID = @id" +
"order by Log_writing_time desc";

@idorder之间没有空间。

这就是为什么它认为有一个变量叫做@idorder

JamesS 和 Yaman 已经介绍了基本问题,但是: 作为一般提示,如果要在 C# 中使用 SQL,逐字字符串文字(@"..."( 可以避免几乎所有的空格问题:

const string query = @"
select top 1 *
from dbo.RadarMF30_log
where SYSTEM_ID = @id
order by Log_writing_time desc";

(注意:它不一定是const- 只是...这里也不需要它是一个变量(

作为旁注:这种场景也可以很好地与"Dapper"等工具配合使用,以避免弄乱 ADO.NET:

var model = conn.QuerySingle<LogModel>(@"
select top 1 *
from dbo.RadarMF30_log
where SYSTEM_ID = @id
order by Log_writing_time desc", new { id = systemId });

不再弄乱命令和参数的细微差别,也不必担心是否过早关闭了连接(仔细观察:您过早关闭了连接(。


作为旁注:您可能还想避免select *- 它可能会导致两种不同类型的问题:

  • 带回大量不需要的大列(CLOB/BLOB 等(,影响性能
  • 有时,只是有时,列不是按您期望的顺序排列;如果您按序号(代码中的GetString(0)等(绑定,这可能会产生巨大的影响; 请注意,"Dapper"按名称绑定,所以这不是一个大问题(假设名称匹配得足够好,库可以弄清楚你的意思(

因为@id和顺序之间没有空格,所以它认为参数名称是@idorder,没有提供

var querystring = "select top 1 * " +
"from dbo.RadarMF30_log " +
"where SYSTEM_ID = @id " +
"order by Log_writing_time desc";

var querystring = "select top 1 * " +
"from dbo.RadarMF30_log " +
"where SYSTEM_ID = @id" +
" order by Log_writing_time desc";

相关内容

  • 没有找到相关文章

最新更新