当前位置: 首页 > 知识库问答 >
问题:

SQL请求工作正常SQL服务器管理工作室,但返回一个错误时发送sql命令C#

葛智敏
2023-03-14

我有以下声明:

SELECT [nozzles].[nozzle_tag],[nozzles].[id]
       FROM [dispensers] 
       INNER JOIN [nozzles] 
       ON [dispenser_id] = [dispensers].[id] 
       INNER JOIN (SELECT * FROM assets 
                   WHERE [i4_Device_Name] = 'EH004T_SOURCE2' 
                   AND [i4_site_name] = 'Les Loges - H2e Station (EH004R)')assets
       ON [asset_id] = [assets].[id]
WHERE [dispenser_tag] ='Dispenser 2';

当我在SSMS中执行它时,它工作得非常好。

问题是,当使用SQLcommand运行此SQL时,我收到一条错误消息:

“Loges”附近的语法不正确。

我不明白为什么。

上面的命令是从一个日志文件中提取出来的,它正是使用SQL命令发送的。

C#代码是:

 using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(HySoSQLCommandBuilder.GetAllNozzleOfDispenser(locationID, dispenserTag), connection))
                {
                    logger.Info("SQL request {request}", HySoSQLCommandBuilder.GetAllNozzleOfDispenser(locationID, dispenserTag));

                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        try
                        {
                            while (reader.Read())
                                if (reader.HasRows)
                                {
                                    list.Add(new nozzle((string)reader["nozzle_tag"], (int)reader["id"]));
                                }
                        }
                        catch { }
                    }
                }

使用HySoSQLCommandBuilder。GetAllNozzleOfDispenser()非常直截了当:

public static string GetAllNozzleOfDispenser(AssetLocationID assetLocation, string dispenserTag)
        {
            return $@"SELECT [nozzles].[nozzle_tag],[nozzles].[id]
                        FROM [dispensers] 
                        INNER JOIN [nozzles] 
                            ON [dispenser_id] = [dispensers].[id] 
                        INNER JOIN (SELECT * FROM assets 
                                    WHERE [i4_Device_Name] = '{assetLocation.i4DeviceName}' 
                                    AND [i4_site_name] = '{assetLocation.i4SiteName}')assets
                            ON [asset_id] = [assets].[id]
                       WHERE [dispenser_tag] ='{dispenserTag}';";
        }

从代码外部无法访问任何注入的值。它们不是来自用户可访问的可编辑字段。如果SQL注入发生,那么这意味着它在源代码中,由处理代码的人完成,并且已经可以对数据库做任何他们想做的事情,而不需要对SQL注入进行编码。

共有1个答案

空鸿云
2023-03-14

更改了代码,因此它使用SQL参数代替,现在它正在工作。我不明白为什么它不起作用,这让我很恼火,因为在不理解的情况下修复一个问题不是它应该如何工作。但至少现在它起作用了。

 类似资料:
  • 去年我在做一个项目,导出和导入都很好,但最近我决定导入我的sql文件,由于每个表中都有很多错误,我无法导入。 一旦我停止工作,我就删除了xampp,现在决定再次下载它,但我被困在导入上,这是我的完整文件: http://pastebin.com/mddVUU1i 我的错误如下: 创建表(int(11)Not NULL, varchar(50)Not NULL,datetime Not NULL D

  • 问题内容: 给我这个: 为什么不: @JosephPla您明白了,谢谢。如何排序数字之类的字符串? 问题答案: 尝试 但是您应该研究将列类型更改为正确的类型。

  • 问题内容: 这个问题已经在这里有了答案 : MySQL中的CHECK约束不起作用 (8个答案) 2年前关闭。 我创建了带有检查约束的表计划: 当我插入违反检查约束的值时,sql报告没有错误。 我插入了一个在order_date之前的dely_date。 问题答案: 与中的约束一样被忽略 工作的实施例使用: LiveDemo 您可以使用触发器进行验证: SqlFiddleDemo

  • 在Apache J Meter中用1个线程触发请求时,我得到以下错误-org.Apache.http.nohttpresponseException:xxx.tc.at.xxx.net:8443未能在org.Apache.http.impl.conn.defaultthtpresponseparser.parsehead(Defaultthtpresponseparser.java:141)在or

  • 问题内容: 我从事SQL的时间不长,但是我想我知道,通过将SQL语句包装在事务中可以完成所有语句,或者没有一个完成。这是我的问题。我有一个具有lineitem集合的订单对象。订单项与order.OrderId相关。我已经验证 所有ID都已设置并且正确, 但是当我尝试保存(插入)订单时,我得到 的INSERT语句与FOREIGN KEY约束“FK_OrderItemDetail_Order”冲突。