首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OleDbDataReader = null

OleDbDataReader = null
EN

Stack Overflow用户
提问于 2014-03-13 04:47:52
回答 1查看 1.3K关注 0票数 2

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

代码语言:javascript
复制
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会说null,有人知道为什么吗?

顺便说一下,返回的值不是空的,读取器本身也是空的。下面是不工作的代码。

代码语言:javascript
复制
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]);
            }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-13 04:56:54

使用反射镜:

OleDbCommand.ExcuteReader

代码语言:javascript
复制
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()->返回的default.the读取器。

代码语言:javascript
复制
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传递'false‘,而它不是。

这里是唯一将this._executeQuery设置为false的地方,但由于Bid.ScopeEnterBid.ScopeLeave的原因,这个调用不是并行的。

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22369292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档