-3

目前,我在尝试构建我的 SQL 表时遇到错误,上面的标题“索引超出范围。必须是非负数且小于集合的大小。参数名称:索引”我没有理解为什么它会抛出这个但是代码本身似乎还可以......

static void Main(string[] args)
    {
        ServiceReference1.ControlPumpsClient WCFSQL = new SQLserver.ServiceReference1.ControlPumpsClient();
        string[] SQLData = new string[6];
        while (WCFSQL.getData()[0] == null) { }

        if (WCFSQL.getData()[0] != null)
        {
            SQLData = WCFSQL.getData();
        }


        SQLiteConnection myConnection = new SQLiteConnection("Data source=test.db; Version=3;");
        myConnection.Open();
        /// If this is not the first time the program has run, 
        /// the table 'cars' will already exist, so we will remove it
        SQLiteCommand tableDropCommand = myConnection.CreateCommand();
        tableDropCommand.CommandText = "drop table Records";
        try
        {
            tableDropCommand.ExecuteNonQuery();
        }
        catch (SQLiteException ex) // We expect this if the table is not present
        {
            Console.WriteLine("Table 'Records' does  not exist");
        }

        /// Now create a table called 'records'
        SQLiteCommand tableCreateCommand = myConnection.CreateCommand();
        tableCreateCommand.CommandText = "create table Records (ID int, FuelType varchar(10), Price float, TankVolume int)";
        tableCreateCommand.ExecuteNonQuery();

        /// Now insert some data.
        /// First, create a generalised insert command
        SQLiteCommand insertCommand = myConnection.CreateCommand();
        insertCommand.CommandText = "insert into Records (ID, FuelType, Price, TankVolumes) values (@id, @fueltype, @price, @volume)";
        insertCommand.Parameters.Add(new SQLiteParameter("@id"));
        insertCommand.Parameters.Add(new SQLiteParameter("@fueltype"));
        insertCommand.Parameters.Add(new SQLiteParameter("@price"));
        insertCommand.Parameters.Add(new SQLiteParameter("@tankvolume"));
        addSQL(insertCommand, int.Parse(SQLData[0]), SQLData[1], float.Parse(SQLData[2]), double.Parse(SQLData[3]));

        /// Now, create a comand to read from the database;
        SQLiteCommand listAllRecordsCommand = myConnection.CreateCommand();
        listAllRecordsCommand.CommandText = "select * from Records";
        SQLiteDataReader reader = listAllRecordsCommand.ExecuteReader();

        /// Iterate over the results and print them
        while (reader.Read())
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(reader["ID"] + ",");
            sb.Append(reader["FuelType"] + ",");
            sb.Append(reader["Price"] + ",");
            sb.Append(reader["Volumes"] + ",");
            Console.WriteLine(sb.ToString());
        }

        myConnection.Close();

        /// Wait for a keypress
        Console.ReadLine();
    }

    public static void addSQL(SQLiteCommand insertCommand, int pumpID, string fuel, float price, double volume){
         /// Now, set the values for the insert command and add two records
        insertCommand.Parameters["@id"].Value = pumpID;
        insertCommand.Parameters["@fueltype"].Value = fuel;
        insertCommand.Parameters["@price"].Value = price;
        insertCommand.Parameters["@volume"].Value = volume;
        insertCommand.ExecuteNonQuery();
    }

}

此行发生错误,以黄色突出显示

insertCommand.Parameters["@volume"].Value = volume;
4

2 回答 2

1

您创建了一个名为 的参数"@tankvolume",但是当您向参数集合添加值时,您尝试使用一个名为 的参数"@volume"。此参数不存在,因此您会遇到异常。只需使用正确的名称,错误就会消失。

或者你可以只使用 AddWithValue 方法

    insertCommand.Parameters.AddWithValue("@id", Convert.ToInt32(SQLData[0]));
    insertCommand.Parameters.AddWithValue("@fueltype",SQLData[1]));
    insertCommand.Parameters.AddWithValue("@price", Convert.ToSingle(SQLData[2]));
    insertCommand.Parameters.AddWithValue("@tankvolume", Convert.ToDouble(SQLData[3]));

我还将尝试在变量数组 SQLData 上添加一些错误检查,如果由于某种原因您没有取回四个有效值,您的代码将再次崩溃。

于 2013-05-07T07:18:11.487 回答
0

尝试这个

SQLiteCommand insertCommand = myConnection.CreateCommand();
        insertCommand.CommandText = "insert into Records (ID, FuelType, Price, TankVolumes) values (@id, @fueltype, @price, @tankvolume)";
        insertCommand.Parameters.Add(new SQLiteParameter("@id"));
        insertCommand.Parameters.Add(new SQLiteParameter("@fueltype"));
        insertCommand.Parameters.Add(new SQLiteParameter("@price"));
        insertCommand.Parameters.Add(new SQLiteParameter("@tankvolume"));
        addSQL(insertCommand, int.Parse(SQLData[0]), SQLData[1], float.Parse(SQLData[2]), double.Parse(SQLData[3]));





public static void addSQL(SQLiteCommand insertCommand, int pumpID, string fuel, float price, double volume){
         /// Now, set the values for the insert command and add two records
        insertCommand.Parameters["@id"].Value = pumpID;
        insertCommand.Parameters["@fueltype"].Value = fuel;
        insertCommand.Parameters["@price"].Value = price;
        insertCommand.Parameters["@tankvolume"].Value = volume;
        insertCommand.ExecuteNonQuery();
    }
于 2013-05-07T06:58:01.160 回答