簡體   English   中英

objDataReader 是 Null - ASP.NET C#

[英]objDataReader is Null - ASP.NET C#

我對 ASP.NET 和 C# 還是很陌生,所以我對事情的運作方式仍然不太了解。 當我運行我的程序並創建維護任務時,我基本上會遇到錯誤。 我的代碼如下所示:

private DataTable getMaintenance()
        {
            DataTable maintenance_dt = new DataTable();
            maintenance_dt.Columns.Add("maintenance_ID");
            maintenance_dt.Columns.Add("DAILY_MAINTENANCE");
            maintenance_dt.Columns.Add("ADMIN_COMMENT");
            string SQLstr = "SELECT MAINTENANCE_ID,DAILY_MAINTENANCE,ADMIN_COMMENT FROM " + maintenance_table + " where " + key + " like " + value + " order by MAINTENANCE_ID ";
            using (DataTableReader objDataReader = OS.OSFunctions.executeSQLQuery(SQLstr))
            {
                while (objDataReader.Read())
                {
                    DataRow mItem = maintenance_dt.NewRow();
                    mItem[0] = objDataReader["MAINTENANCE_ID"].ToString();
                    mItem[1] = objDataReader["DAILY_MAINTENANCE"].ToString();
                    if (objDataReader["ADMIN_COMMENT"] != DBNull.Value)
                    {
                        mItem[2] = objDataReader["ADMIN_COMMENT"].ToString();
                    }
                    else
                    {
                        mItem[2] = "";
                    }
                    maintenance_dt.Rows.Add(mItem);
                }
            }
            return maintenance_dt;
        }

我從運行這個狀態得到的錯誤

Object 引用未設置為 object 的實例。 objDataReader 是 null

當我嘗試創建維護任務時會發生這種情況。 代碼也在下面:

protected void createMaintenance_Click(object sender, System.EventArgs e)
        {
            string SQLstr;

                if (txtMaintenanceName.Text.Length > 0)
                {
                    if (maintenance_table == "ACTIVE_DAILYMAINTENANCE")
                    {
                        SQLstr = "SELECT TOP(1) MAINTENANCE_ID FROM ACTIVE_DAILYMAINTENANCE WHERE SCHEDULE_DATE = " + value + " ORDER BY MAINTENANCE_ID desc";
                        using (DataTableReader objDataReader = OS.OSFunctions.executeSQLQuery(SQLstr))
                        {
                            if (objDataReader.Read())
                            {
                                int id = Convert.ToInt32(objDataReader["Maintenance_ID"]) + 1;
                                SQLstr = "insert into " + maintenance_table + " (maintenance_id, DAILY_MAINTENANCE, " + key + ", ADMIN_COMMENT) values ('" + id + "',"
                                    + " '" + txtMaintenanceName.Text + "'," + value + ",'" + txtAdminMaintenanceComment.Text + "')";
                                OS.OSFunctions.executeSQLNonQuery(SQLstr);
                            }
                        }
                    }
                    else
                    {
                        SQLstr = "insert into " + maintenance_table + "(DAILY_MAINTENANCE, " + key + ", ADMIN_COMMENT) values ('" + txtMaintenanceName.Text + "'," + value + ",'" + txtAdminMaintenanceComment.Text + "')";
                        OS.OSFunctions.executeSQLNonQuery(SQLstr);
                    }
        }

同樣,是 getMaintenance() 方法給了我錯誤。 這也不是我的全部代碼,我稍后會在 CreateMaintenance 的代碼中調用 getMaintenance() function。 任何幫助將不勝感激。

編輯:代碼嘗試數據集

private DataSet getMaintenance()
{
   DataSet maintenance_ds = new DataSet();
            string SQLstr= "SELECT MAINTENANCE_ID,DAILY_MAINTENANCE,ADMIN_COMMENT FROM " + maintenance_table + " where " + key + " like " + value + " order by MAINTENANCE_ID ";
            using(SqlConnection connection=new SqlConnection(ConfigurationManager.ConnectionStrings["SQLConnectionString"].ConnectionString))
            {
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(SQLstr, connection);
                adapter.Fill(maintenance_ds);
                return maintenance_ds;
            }
}

所以,你執行

DataTableReader objDataReader = OS.OSFunctions.executeSQLQuery(SQLstr)

在您using . SQLstr

"SELECT MAINTENANCE_ID,DAILY_MAINTENANCE,ADMIN_COMMENT FROM " + maintenance_table + " where " + key + " like " + value + " order by MAINTENANCE_ID ";

您將需要使用調試器並在引發錯誤之前跳轉到該行。 首先,您需要找出maintenance_tablekeyvalue是什么。 嘗試找出生成的查詢是什么並在您的 RDBMS 中運行它,我認為它很可能由於某種原因返回null

如果您打算進行“包含”而不是“ value ”檢查,則可能只是缺少%的通配符。

無論如何,為了檢測錯誤是什么,您需要找出正在生成的內容以及為什么您的查詢會導致null 一旦你知道問題是什么,你也會知道你需要修復什么,這在很大程度上簡化了問題。

由於您不使用參數化查詢,我不得不提一下,如果您連接到查詢的任何動態值可能來自不受信任的來源,例如用戶輸入,那么您的查詢很容易受到SQL 注入,您需要保護你的項目反對這個潛在的利用。

您確實意識到可以將 sql 發送到數據表,並為您創建列和數據表。

因此,使用此代碼獲取/返回數據表。

不清楚您“其他”是要更新現有行還是插入新行,但代碼可能看起來像這樣:

  protected void createMaintenance_Click(object sender, System.EventArgs e)
    {
        DateTime value = DateTime.Today;
        string maintenance_table = "";
        string SQLstr = "";
        string key = "";

        if (txtMaintenanceName.Text.Length > 0)
        {

            if (maintenance_table == "ACTIVE_DAILYMAINTENANCE")
            {
                // add new row
                int id = NextMaintID(value);
                string strSQL = @"SELECT * FROM " + maintenance_table + " WHERE Maintenance_ID = 0";
                DataTable rstSched = MyRst(strSQL);
                DataRow MyNewRow = rstSched.NewRow();

                MyNewRow["maintenance_id"] = id;
                MyNewRow["DAILY_MAINTENANCE"] = txtMaintenanceName.Text;
                MyNewRow["ADMIN_COMMENT"] = txtAdminMaintenanceComment.Text;
                rstSched.Rows.Add(MyNewRow);
                MyUpdate(rstSched, strSQL);
            }
        }
        else
        {
            // update (or add to daily?????
            string strSQL = @"SELECT * FROM " + maintenance_table + " WHERE Maintenance_ID = " + key;
            DataTable rstSched = MyRst(strSQL);
            DataRow MyRow = rstSched.Rows[0];
            MyRow["DAILY_MAINTENANCE"] = txtMaintenanceName.Text;
            MyRow["ADMIN_COMMENT"] = txtAdminMaintenanceComment.Text;
            MyUpdate(rstSched, strSQL);
        }
    }

所以,我只需要一些輔助例程 - (在 static class 中將它們設為全局 - 然后你可以在任何地方使用它 - 節省大量代碼。

所以使用了這些:

    public DataTable MyRst(string strSQL)
    {
        // return data table based on sql
        DataTable rstData = new DataTable();
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                cmdSQL.Connection.Open();
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }
        return rstData;
    }


    public DataTable MyRstP(SqlCommand cmdSQL)
    {
        // return data table based on sql command (for parmaters)
        DataTable rstData = new DataTable();
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (cmdSQL)
            {
                cmdSQL.Connection = conn;
                conn.Open();
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }
        return rstData;
    }

    void  MyUpdate(DataTable rstData, string strSQL)
    {
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(cmdSQL);
                SqlCommandBuilder daU = new SqlCommandBuilder(da);
                da.Update(rstData);
            }
        }
    }

當然還有這個:

    int NextMaintID (DateTime value)
    {
        int result = 0;
        string SQLstr = @"SELECT TOP(1) MAINTENANCE_ID FROM ACTIVE_DAILYMAINTENANCE 
                        WHERE SCHEDULE_DATE = @scDate ORDER BY MAINTENANCE_ID desc";
        SqlCommand cmdSQL = new SqlCommand(SQLstr);
        cmdSQL.Parameters.Add("@scDate", SqlDbType.Date).Value = value;

        DataTable rstNextID = MyRstP(cmdSQL);
        result = ((int)rstNextID.Rows[0]["Maintenance_ID"]) + 1;

        return result;

    }

那么,你怎么吃大象呢? 答:一口一口!!!

因此,只分解“少數”幫助程序例程,允許對數據表 object 進行數據操作。 該更新命令將適用於編輯、添加到行,甚至刪除單行的行方法。 因此,所有此類更新都可以通過一個簡單的更新命令來完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM