C#和SQL - 必须声明写入DB的标量变量

Eve*_*NRG 0 c# sql sql-server

我已经在这几个小时了,不能休息一下.我正在用C#编写这个程序,它连接到数据库并在每次有新的传感器读数时写入新的行.将新行写入DB的Function片段如下所示.

当我运行我的代码时,我继续得到以下运行时错误:

System.Data.SqlClient.SqlException(0x80131904):必须声明标量变量"@dbSpeed".

当我从使用常规旧数组切换到Dictionary时,我开始遇到这个问题,但我不确定是什么原因.

private void WriteDataRowtoSQL(Dictionary<string, double> dataPoints)
{
     //SQL Database Connection String.
    string dataSource = @"Data Source=TSCRPC\TSCRPCDB;Initial Catalog=TSCRPCDB;Integrated Security=True";

    //SQL Database Query Command Build to insert sensor data as rows.  
    string sensorDataRowItems = "(Date,Time,Mac_State,S_GainStatus,S_Speed,S_Direction,S_Temperature,S_Humidity,S_PowerOutput,S_Current,S_Voltage,S_EngineRPM,S_NoiseLevel,S_BatteryVolts,S_TorkStrain1,S_TorkStrain2,S_WheelStrain,S_Vibration1,S_Vibration2,S_BreakPressure)";
    string cmdString = "INSERT INTO SensorData " + sensorDataRowItems + " VALUES (@dbDate, @dbTime, @dbMacState, @dbGainStatus, @dbSpeed, @dbDirection, @dbTemperature, @dbHumidity, @dbPowerOutput, @dbCurrent, @dbVoltage, @dbEngineRPM, @dbNoiseLevel, @dbBatteryVolts, @dbTorkStrain1, @dbTorkStrain2, @dbWheelStrain, @dbVibration1, @dbVibration2, @dbBreakPressure)";

    //Connect to and use SQL DB.
    using (SqlConnection sqlConn = new SqlConnection(dataSource))
    {
        using (SqlCommand comm = new SqlCommand())
        {
            comm.Connection = sqlConn;
            comm.CommandText = cmdString;

            if (dataPoints.ContainsKey("Gain Status") == true)
            {
                comm.Parameters.AddWithValue("@dbGainStatus", true); 
            }
            else if (dataPoints.ContainsKey("Battery Voltage") == true)
            {
                comm.Parameters.AddWithValue("@dbBatteryVolts", dataPoints["Battery Voltage"]);
            }
            else if (dataPoints.ContainsKey("Break Line Pressure") == true)
            {
                comm.Parameters.AddWithValue("@dbBreakPressure", dataPoints["Break Line Pressure"]);
            }
            else if (dataPoints.ContainsKey("Volts") == true)
            {
                comm.Parameters.AddWithValue("@dbVoltage", dataPoints["Volts"]);
            }
            else if (dataPoints.ContainsKey("Current") == true)
            {
                comm.Parameters.AddWithValue("@dbCurrent", dataPoints["Current"]);
            }
            else if (dataPoints.ContainsKey("Vibration") == true)
            {
                comm.Parameters.AddWithValue("@dbVibration1", dataPoints["Vibration"]);
            }
            else if (dataPoints.ContainsKey("Tork Strain 1") == true)
            {
                comm.Parameters.AddWithValue("@dbTorkStrain1", dataPoints["Tork Strain 1"]);
            }
            else if (dataPoints.ContainsKey("Tork Strain 2") == true)
            {
                comm.Parameters.AddWithValue("@dbTorkStrain2", dataPoints["Tork Strain 2"]);
            }
            else if (dataPoints.ContainsKey("Speed") == true)
            {
                comm.Parameters.AddWithValue("@dbSpeed", dataPoints["Speed"]);
            }
            else if (dataPoints.ContainsKey("Engine RPM") == true)
            {
                comm.Parameters.AddWithValue("@dbEngineRPM", dataPoints["Engine RPM"]);
            }

            comm.Parameters.AddWithValue("@dbDate", DateTime.Now.ToString("M/d/yyyy"));
            comm.Parameters.AddWithValue("@dbTime", DateTime.Now.ToString("H:m:s:fff"));
            comm.Parameters.AddWithValue("@dbMacState", true);  
            comm.Parameters.AddWithValue("@dbDirection", 22);
            comm.Parameters.AddWithValue("@dbTemperature", 22);
            comm.Parameters.AddWithValue("@dbHumidity", 22);
            comm.Parameters.AddWithValue("@dbPowerOutput", 22);
            comm.Parameters.AddWithValue("@dbNoiseLevel", 22);
            comm.Parameters.AddWithValue("@dbVibration2", 22);
            comm.Parameters.AddWithValue("@dbWheelStrain", 22);

            try
            {
                sqlConn.Open();
                comm.ExecuteNonQuery();
            }
            catch(SqlException e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }  
}
Run Code Online (Sandbox Code Playgroud)

D S*_*ley 6

您需要在查询中添加所有参数,即使它们没有值.更改

if (dataPoints.ContainsKey("Gain Status") == true)
{
    comm.Parameters.AddWithValue("@dbGainStatus", true); 
}
Run Code Online (Sandbox Code Playgroud)

喜欢的东西

comm.Parameters.AddWithValue("@dbGainStatus", 
    dataPoints.ContainsKey("Gain Status") ? (object)true : DBNull.Value); 
Run Code Online (Sandbox Code Playgroud)

依此类推每个参数(更改true为您打算使用的值)