【问题标题】:fatal error in sql command executing in asp.net class file在 asp.net 类文件中执行的 sql 命令中的致命错误
【发布时间】:2013-05-30 06:15:27
【问题描述】:

我正在尝试从表中获取一些数据。此查询使用 mysql 运行良好,但在 asp.net c# 类文件中执行时会引发异常: sql查询中的致命错误.. 内部异常@c 未定义..

string sqlQuery = "SET @c:=0;
SELECT * FROM (SELECT TimeStamp, FwdHr, W , @c:=@c+1 as counter
  FROM Meter_Data WHERE TimeStamp >= @fromTime AND TimeStamp <= @toTime
  AND MeterID = @meterID" + " AND DeviceID = @deviceID) as tmp
WHERE counter % 20 =1 ORDER BY TimeStamp";

@c怎么定义呢?因为它在 SQL 服务器

中运行良好

【问题讨论】:

    标签: c# asp.net mysql sql database


    【解决方案1】:

    您执行的不是单个查询,而是多个语句。

    您在开始时设置的@c 也是用于参数化查询的相同格式。

    c# 在您发送的参数列表中搜索@c,由于未找到,因此您会收到错误消息。

    你最好在 mysql 中编写一个接受你的参数并返回结果的例程。变量@c 将在例程内部。

    【讨论】:

    • 如果我从 c# var 传递 @c 作为外部参数会怎样?
    • 您可以将其设置为0 作为参数,但我猜mysql不会将其视为内部参数并为每一行更新它。试一试没有坏处。
    • 是的,这就是问题所在。对于没有变量的类似结果,是否有其他方法可以声明变量或任何其他查询? @nunepascal
    • 在mysql中编写例程非常简单。非常适合您的需求。为什么不这样做?
    • 如果你在 SQL Server 中写过存储过程,也是一样的。几行代码,应该说很简单。
    【解决方案2】:

    您在查询中定义了一个参数,在 SQL 中它在 c# 中可以,您没有在查询中声明参数 你只把它们传给它

    查看此网站以获取示例 (site)

    更好的是,创建一个存储过程并调用它,而不是在代码中编写查询

    这样更好,因为它会被预编译,并且向服务器发送的数据更少

    否则,每次您将查询发送到服务器时,它都会被重新评估并再次编译

    【讨论】:

    • 我没有使用过存储过程。你能帮我吗?这些参数也会减慢查询速度。 @simsim
    • 你使用的数据库是什么?
    • 啊哈,mysql,刚刚注意到...对不起,我对mysql不是很熟悉
    • 我正在使用 MySQL.. 是否有任何替代方法可以在不为此查询使用变量的情况下获得相同的结果?
    • 通过查看您的查询,您可以对数据进行排名,而不是使用@c 参数作为计数器,这样您就不需要第一个参数google 如何在 mysql 中完成此操作,另外,在与参数值连接的字符串中构造查询而不是使用参数将起作用,但这会使您面临 sql 注入的风险,不推荐
    【解决方案3】:

    可以通过简单的查询 bcz 时间戳是 int 来完成,它的增量类似于 - 1902020222、1902020223、...

     string sqlQuery = "SELECT TimeStamp, FwdHr, W FROM Meter_Data WHERE TimeStamp >= @fromTime AND TimeStamp <= @toTime AND MeterID = @meterID" +
                            " AND DeviceID = @deviceID AND TimeStamp%20 = 0 ORDER BY TimeStamp;";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2020-10-15
      相关资源
      最近更新 更多