2

我目前正在构建一个程序,它将用户之间的消息存储在数据库中,并在按下下面的按钮时将这些消息返回给用户。我正在使用使用 aOleDbConnection和使用DataReader.

private void button3_Click(object sender, EventArgs e)
{

    string [] lec_name = new  string [10] ;
    string [] content = new  string [10] ; 
    string conn = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=C:\\Users\\Leon\\Admin.sdf";
    OleDbConnection connection = new OleDbConnection(conn);
    OleDbCommand command = connection.CreateCommand();
    command.CommandText = "SELECT * FROM Contact_DB WHERE Student_ID =" + iD + " AND Direction = '" + "To the student" + "'";

    try
    {
        connection.Open();
    }
    catch (Exception ex)
    {
        MessageBox.Show("" + ex.Message); 
    }

    OleDbDataReader reader = command.ExecuteReader();
    int up = 0;
    int count = 0;

    while (reader.Read())
    {
        lec_name[up] = reader["Lecturer_Name"].ToString();
        content[up] = reader["Description"].ToString();
        up++;
        MessageBox.Show("The lecturer " + lec_name[count] + " has messaged you saying :" + "\n" + content[count]);
        count++;
    }
}

这段代码适用于我的Student班级,但是当我在Lecturer班级内重用代码并进行细微更改时,显示为OledbDataReader空,有人知道为什么吗?
顺便说一句,返回的值不为空,阅读器本身为空。以下是非工作代码。

private void button2_Click(object sender, EventArgs e)
    {
        string [] studentID = new  string [10] ;
        string [] content = new  string [10] ; 
        string conn = "Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=C:\\Users\\Leon\\Admin.sdf";
            OleDbConnection connection = new OleDbConnection(conn);
            OleDbCommand command = connection.CreateCommand();
            command.CommandText = "SELECT * FROM Contact_DB WHERE Lecturer_Name =" + full + " AND Direction = '" + "To the lecturer" + "'";
            try
            {
                connection.Open();

            }
            catch (Exception ex)
            {
                MessageBox.Show("" + ex.Message); 
            }
            OleDbDataReader reader1 = command.ExecuteReader();
            int up = 0;
            int count = 0;
            while (reader1.Read())
            {

                 studentID[up] = reader1["Student_ID"].ToString();
                 content[up] = reader1["Description"].ToString();
                 up++;

            }
            MessageBox.Show("The student " + studentID[count] + " has messaged you saying :" + "\n" +content[count]);
            }
    }
4

1 回答 1

2

使用反射器:

OleDbCommand.ExcuteReader

public OleDbDataReader ExecuteReader(CommandBehavior behavior)
{
 OleDbDataReader reader;
 IntPtr ptr;
 OleDbConnection.ExecutePermission.Demand();
 Bid.ScopeEnter(out ptr, "<oledb.OleDbCommand.ExecuteReader|API> %d#, behavior=%d{ds.CommandBehavior}\n", this.ObjectID, (int) behavior);
 try
 {
     this._executeQuery = true;
     reader = this.ExecuteReaderInternal(behavior, "ExecuteReader");
 }
 finally
 {
     Bid.ScopeLeave(ref ptr);
 }
 return reader;
}

CommandBehavior 是默认的。this 返回的阅读器。ExecuteReaderInternal()---->

private OleDbDataReader ExecuteReaderInternal(CommandBehavior behavior, string method)
{
 OleDbDataReader dataReader = null;
 OleDbException previous = null;
 int num2 = 0;
 try
 {
     object obj2;
     int num;
     this.ValidateConnectionAndTransaction(method);
     if ((CommandBehavior.SingleRow & behavior) != CommandBehavior.Default) behavior |= CommandBehavior.SingleResult;
     switch (this.CommandType)
     {
     case ((CommandType) 0):
     case CommandType.Text:
     case CommandType.StoredProcedure:
         num = this.ExecuteCommand(behavior, out obj2);
         break;

     case CommandType.TableDirect:
         num = this.ExecuteTableDirect(behavior, out obj2);
         break;

     default:
         throw ADP.InvalidCommandType(this.CommandType);
     }
     if (this._executeQuery)
     {
         try
         {
             dataReader = new OleDbDataReader(this._connection, this, 0, this.commandBehavior);
             switch (num)
             {
             case 0:
                 dataReader.InitializeIMultipleResults(obj2);
                 dataReader.NextResult();
                 break;

             case 1:
                 dataReader.InitializeIRowset(obj2, ChapterHandle.DB_NULL_HCHAPTER, this._recordsAffected);
                 dataReader.BuildMetaInfo();
                 dataReader.HasRowsRead();
                 break;

             case 2:
                 dataReader.InitializeIRow(obj2, this._recordsAffected);
                 dataReader.BuildMetaInfo();
                 break;

             case 3:
                 if (!this._isPrepared) this.PrepareCommandText(2);
                 OleDbDataReader.GenerateSchemaTable(dataReader, this._icommandText, behavior);
                 break;
             }
             obj2 = null;
             this._hasDataReader = true;
             this._connection.AddWeakReference(dataReader, 2);
             num2 = 1;
             return dataReader;
         }
         finally
         {
             if (1 != num2)
             {
                 this.canceling = true;
                 if (dataReader != null)
                 {
                     dataReader.Dispose();
                     dataReader = null;
                 }
             }
         }
     }
     try
     {
         if (num == 0)
         {
             UnsafeNativeMethods.IMultipleResults imultipleResults = (UnsafeNativeMethods.IMultipleResults) obj2;
             previous = OleDbDataReader.NextResults(imultipleResults, this._connection, this, out this._recordsAffected);
         }
     }
     finally
     {
         try
         {
             if (obj2 != null)
             {
                 Marshal.ReleaseComObject(obj2);
                 obj2 = null;
             }
             this.CloseFromDataReader(this.ParameterBindings);
         }
         catch (Exception exception3)
         {
             if (!ADP.IsCatchableExceptionType(exception3)) throw;
             if (previous == null) throw;
             previous = new OleDbException(previous, exception3);
         }
     }
 }
 finally
 {
     try
     {
         if (dataReader == null && 1 != num2) this.ParameterCleanup();
     }
     catch (Exception exception2)
     {
         if (!ADP.IsCatchableExceptionType(exception2)) throw;
         if (previous == null) throw;
         previous = new OleDbException(previous, exception2);
     }
     if (previous != null) throw previous;
 }
 return dataReader;
}

this._executeQuery包装 的新实例OleDbDataReader,如果它不运行,dataReader将是null.

读取器返回为 null 的唯一方法是内部 RunExecuteReader 方法为 returnStream 传递了“假”,但事实并非如此。

这里是唯一this._executeQuery设置为的地方,但由于和false,这个地方没有被并行调用。Bid.ScopeEnterBid.ScopeLeave

public override int ExecuteNonQuery()
    {
        int num;
        IntPtr ptr;
        OleDbConnection.ExecutePermission.Demand();
        Bid.ScopeEnter(out ptr, "<oledb.OleDbCommand.ExecuteNonQuery|API> %d#\n", this.ObjectID);
        try
        {
            this._executeQuery = false;
            this.ExecuteReaderInternal(CommandBehavior.Default, "ExecuteNonQuery");
            num = ADP.IntPtrToInt32(this._recordsAffected);
        }
        finally
        {
            Bid.ScopeLeave(ref ptr);
        }
        return num;
    }

理论上,如果无法执行查询,则数据读取器可以为空。

更新: https ://github.com/Microsoft/referencesource/blob/master/System.Data/System/Data/OleDb/OleDbCommand.cs#L658

于 2014-03-13T04:56:54.193 回答