none
Fill: SelectCommand.Connection property has not been initialized 問題 RRS feed

  • 問題

  •  Dear all:

                   請問大家在我的程式碼中為何dataAdapter.Fill( set );
    會出錯呢?出錯原因是Fill: SelectCommand.Connection property has not been initialized.

     

    想在請教大家另一個問題是若我不用DataSet來接的話,還可以用什麼來寫比較好?

     

    Code Snippet

    public List<InfoData> ReadSpecifiedInfoDataFromDatabaseByUserName(IDbConnection connection, string userName)
            {
                List<InfoData> datas = new List<InfoData>();

                using ( connection )
                {
                    SqlCommand sqlCommand = new SqlCommand( string.Format( "SELECT * FROM LogContent WHERE ClientUserName = '{0}'", userName ) );
                    sqlCommand.CommandTimeout = 0;
                    SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCommand);
                    DataSet set = new DataSet();
                    dataAdapter.Fill( set );
                    for (int i = 0; i < set.Tables[0].Rows.Count; i++)
                    {
                        InfoData infodata = new InfoData();

                        infodata.Id = Convert.ToInt32(set.Tables[0].Rows[i]["Id"].ToString());
                        infodata.MachineName = set.Tables[0].Rows[i]["ClientMachineName"].ToString();
                        infodata.UserName = set.Tables[0].Rows[i]["ClientUserName"].ToString();
                        infodata.AssemblyName = set.Tables[0].Rows[i]["EntryAssemblyName"].ToString();
                        infodata.AssemblyFullName = set.Tables[0].Rows[i]["EntryAssemblyFullName"].ToString();
                        infodata.AssemblyLocation = set.Tables[0].Rows[i]["EntryAssemblyLocation"].ToString();
                        infodata.AssemblyCompanyName = set.Tables[0].Rows[i]["EntryAssemblyCompanyName"].ToString();
                        infodata.LogHappenedTime = Convert.ToDateTime(set.Tables[0].Rows[i]["LogHappenedTime"].ToString());
                        infodata.Category = (InfoData.WarningCategory)Convert.ToInt32(set.Tables["LogContent"].Rows[i]["WarningCategoryId"].ToString());
                        infodata.Title = set.Tables[0].Rows[i]["LogTitle"].ToString();
                        infodata.Content = set.Tables[0].Rows[i]["LogContent"].ToString();

                        datas.Add(infodata);
                    }

                    SqlDataReader OrderReader = sqlCommand.ExecuteReader();
                    return datas;
                }
            }

     

     

    2007年7月10日 上午 08:20

解答

所有回覆

  • 一、這個錯誤訊息是因為connection沒有被new起來

           所以應該改成這樣:

    SqlCommand sqlCommand = new SqlCommand( string.Format( "SELECT * FROM LogContent WHERE ClientUserName = '{0}'", userName ) ,connection);

     

    二、用DataReader接效能會比較好。

    2007年7月10日 上午 08:40
    版主
  • Dear LOLOTA:

     

    1.請問我照您方式加了後卻那邊會出錯,訊息↓:

    cannot convert from 'System.Data.IDbConnection' to 'System.Data.SqlClient.SqlConnection' C:\Documents and Settings\polo.su\Desktop\Booc.Bi.Log\Booc.Bi.Log\InfoData.cs 177 138 Booc.Bi.Log

     

    2.請問用DataReader接的話要怎麼把查出來的值填入這個物件呢?InfoData infodata = new InfoData();

       不太懂得是這個物件裡有Id,MachineName,UserName...等等

    2007年7月10日 上午 08:49
  • 一、第一個問題我更正一下,剛剛沒看到是用IDbConnection,這邊是把我放的connect改成

            New System.Data.SqlClient.SqlConnection(connection.ConnectionString) 這樣應該就可以了

     

    二、填法應該類似單筆的DataRow,因為DataReader一次讀一筆資料,所以這樣在您的

            例子中能增加效能,您可以參考下列網頁:

             Retrieving Data Using the DataReader 

    2007年7月10日 上午 09:14
    版主
  • Dear LOLOTA:

                              我試著去用DataReader來填可是在cmd.ExecuteReader();這邊就會出錯了

     

                  SqlDataReader rdr = null;
                    SqlCommand cmd = new SqlCommand(string.Format("SELECT * FROM LogContent WHERE ClientUserName = '{0}'", userName), connection.ConnectionString);
                    rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {

                    .......................

                    ..............

                   }

    2007年7月10日 上午 09:26
  • 錯誤訊息是?

    還有command不是放連線字串 ->connection.ConnectionString

    而是要放sqlconnection物件喔。

    2007年7月10日 上午 09:30
    版主
  • using ( connection ) 這行就錯了,那有這種語法.
        

    2007年7月10日 上午 09:39
  • Dear 好說:

                       請問您說這using ( connection ) 這行就錯了,能解釋一下嗎?不然不懂!?

                       我用Unit Test並沒說這行有錯!?

    2007年7月10日 上午 10:00
  • 你的程式碼其實只要改一個地方就可以了:

     

    Code Snippet

    public List<InfoData> ReadSpecifiedInfoDataFromDatabaseByUserName(IDbConnection connection, string userName)
            {
                List<InfoData> datas = new List<InfoData>();

                using ( connection )
                {
                    SqlCommand sqlCommand = new SqlCommand( 
                          string.Format( "SELECT * FROM LogContent WHERE ClientUserName = '{0}'", userName ) );
                    sqlCommand.CommandTimeout = 0;

                  sqlCommand.Connection = connection;
                    SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCommand);
                    DataSet set = new DataSet();
                    dataAdapter.Fill( set );
                    for (int i = 0; i < set.Tables[0].Rows.Count; i++)
                    {
                        ...
                    }

                 

                 SqlDataReader OrderReader = sqlCommand.ExecuteReader();
                    return datas;
                }
            }

     

    2007年7月10日 上午 10:11
    版主
  • Dear 小朱:

                       會出錯因為IDbConnection' 的關係....

     

                       Error 1 Cannot implicitly convert type 'System.Data.IDbConnection' to 'System.Data.SqlClient.SqlConnection'. An explicit conversion exists (are you missing a cast?) 

    2007年7月10日 上午 10:16
  • 那你用這樣看看:

     

    command.Connection = (SqlConnection)connection;

    2007年7月10日 上午 10:43
    版主
  • Dear 小朱:

                       可以用了~真是謝謝,是否可以在請教另一個問題,就是我有一個InfoData裡有一個WarningCategory用來抓存訊息,可是我在取的值這邊發生了一個轉型問題"infodata.Category = ( InfoData.WarningCategory ) Convert.ToInt32(set.Tables["LogContent"].RowsIdea["WarningCategoryId"].ToString());",這行在Unit Test會出錯?,請問大大是我轉型寫錯了嗎

     

    Code Snippet

    public class InfoData
        {
            public enum WarningCategory
            {
                Error,
                Warning,
                Information,
                Debug
            }

           ................
            private DateTime _logHappenedTime;
            private WarningCategory _category = WarningCategory.Information;      
            private string _title;
            ........................

     

           public WarningCategory Category
            {
                get { return _category; }
                set { _category = value; }
            }

    }

     

     

    2007年7月10日 上午 10:54