代码之家  ›  专栏  ›  技术社区  ›  oglilprettythug

在SQL表中插入值时遇到问题,值会被误认为列

  •  -1
  • oglilprettythug  · 技术社区  · 2 年前

    我不断收到一个异常,显示“无效的列名,'IBM'”错误发生在“++@ticker+”,即使@ticker是在值中声明的。我怀疑这个错误可能发生在查询中的其他某个点上,但我对SQL/t-SQL非常陌生,所以我不确定如何确定在哪里。

    private string InsertRecord(Indicator indicator)
            {
                try
                {
                    if (!CheckIfColumnExists(indicator.GetType().Name))
                    {
                        AddColumn(indicator.GetType().Name, SqlDbType.Real);
                    }
    
                    const string query = @"
                    DECLARE @sql nvarchar(max) = '
                    INSERT INTO ' + QUOTENAME(@tableName) + '(
                    ' + QUOTENAME(@indicator) + ', date, ticker)  
                    VALUES(' + @indicatorValue + ', ' + @date + ', ' + @ticker + ') 
                    ';
    
                    EXEC sp_executesql @sql;
                    ";
    
                    //checking if the record is already there
                    if (!CheckIfRecordExists(indicator))
                    {
                        using (SqlConnection conn = new SqlConnection(this.connectionstring))
                        {
    
    
    
                            conn.Open();
    
    
                            SqlCommand cmd = new SqlCommand(query , conn);
                            cmd.Parameters.AddWithValue("@tableName", tableName);
                            cmd.Parameters.AddWithValue("@indicator", indicator.GetType().Name);
                            cmd.Parameters.AddWithValue("@indicatorValue", indicator.Value.ToString());
                            cmd.Parameters.AddWithValue("@date", indicator.Date.ToString("yyyy-MM-dd"));
                            cmd.Parameters.AddWithValue("@ticker", indicator.Ticker);
                            var result = cmd.ExecuteNonQuery();
                            
    
    
                            
                            return "New Record Inserted";
    
    
                        }
                    }
                    else
                    {
                        return "Record Already Exists";
                    }
                }
                catch
                {
                    return "Failure Inserting New Record";
                }
            }
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   Yong Shun    2 年前

    担忧

    1. 不能使用参数附加表名和列名的值。相反 字符串串联 虽然这会 导致开放式SQL注入攻击 (例如: Bobby Tables ).因此,请确保 做了足够的验证 对于 tableName 或者字符串连接部分。

    2. 您不需要附加单引号 ' 用于查询中的参数。这将在以下情况下自动完成: SQLCommand 附加 SQLParameter 根据参数类型查询的值。

    3. 我看不出有必要使用 EXEC sp_executesql .而你可以直接执行 INSERT 查询

    4. 在StackOverflow社区中,通常会建议使用 SqlCommand.Add("@Name", SqlDbType).Value 并指定参数类型,而不是 SqlCommand.AddWithValue() 提到 Can we stop using AddWithValue() already? .

    总之,你的 SqlCommand 应该是:

    string query = @"
        INSERT INTO " + tableName + 
        "(" + indicator.GetType().Name + ", date, ticker)" +
        " VALUES (@indicatorValue, @date, @ticker)"; 
    
    SqlCommand cmd = new SqlCommand(query , conn);
    cmd.Parameters.Add("@indicatorValue", SqlDbType.NVarchar).Value = indicator.Value.ToString();
    cmd.Parameters.Add("@date", SqlDbType.NVarchar).Value = indicator.Date.ToString("yyyy-MM-dd");
    cmd.Parameters.Add("@ticker", SqlDbType.NVarchar).Value = indicator.Ticker;