使用OleDbCommand选择语句会抛出InvalidOperationException

时间:2015-05-06 19:00:41

标签: c# sql visual-studio oledb

我需要在C#中找到一条记录,但是我得到一个InvalidOperationException:

public static Auto findAuto(int kfznr)
{
    Auto retAuto = new Auto();
    try
    {
        myOleDbConnection.Open();
        string query = "SELECT * FROM Auto WHERE Auto.KFZNR = " + kfznr; 

        OleDbCommand select = new OleDbCommand();
        select.Connection = myOleDbConnection;
        select.CommandText = query;
        OleDbDataReader reader = select.ExecuteReader();

        while (reader.Read())
        {
            Auto at = new Auto(Convert.ToInt32(reader[0]), Convert.ToString(reader[1]), Convert.ToString(reader[2]));

            retAuto = at;
        }
    }
    catch (OleDbException e)
    {

        Console.WriteLine(e.ToString());
    }

    return retAuto;
}

我在创建新Auto时在while循环中收到错误。 当我在SQLDeveloper中运行相同的查询时,我得到一条记录(看一下第一个截图),但在我的C#程序中,我得到的是我的行/单元格没有数据。

The output from the SQLDeveloper

当我悬停阅读器时,我得到以下图像。它说读者有行: Screenshot from Visual Studio

希望你能帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

您需要使用reader.GetValue(0)

    public static Auto findAuto(int kfznr)
    {
        Auto retAuto = new Auto();
        try
        {
            myOleDbConnection.Open();
            string query = "SELECT * FROM Auto WHERE Auto.KFZNR = " + kfznr; 

            OleDbCommand select = new OleDbCommand();
            select.Connection = myOleDbConnection;
            select.CommandText = query;
            OleDbDataReader reader = select.ExecuteReader();

            while (reader.Read())
            {
                Auto at = new Auto(Convert.ToInt32(reader.GetValue(0)), Convert.ToString(reader.GetValue(1)), Convert.ToString(reader.GetValue(2)));

                retAuto = at;
            }
        }
        catch (OleDbException e)
        {

            Console.WriteLine(e.ToString());
        }

        return retAuto;
    }

还想添加...您也可以使用以下命令按列名访问阅读器值:

reader [“ColumnName”] ...不要忘记列名称旁边的“”;)

public static Auto findAuto(int kfznr)
{
    Auto retAuto = new Auto();
    try
    {
        myOleDbConnection.Open();
        string query = "SELECT * FROM Auto WHERE Auto.KFZNR = " + kfznr; 

        OleDbCommand select = new OleDbCommand();
        select.Connection = myOleDbConnection;
        select.CommandText = query;
        OleDbDataReader reader = select.ExecuteReader();

        while (reader.Read())
        {
            Auto at = new Auto(Convert.ToInt32(reader["col1"]), Convert.ToString(reader["col2"]), Convert.ToString(reader["col3"]));

            retAuto = at;
        }
    }
    catch (OleDbException e)
    {

        Console.WriteLine(e.ToString());
    }

    return retAuto;
}