閱讀772 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C# 數據庫dataGridView刷新數據和主外鍵判斷

本文主要講訴在使用VS2012+SQL Server數據庫做係統中,通常會遇到幾個問題.使用dataGridView控件在修改、刪除、插入數據後,怎樣刷新數據顯示操作後的結果.同時在對數據操作時通常會判斷數據的主鍵是否存在或重複,判斷外鍵是否重複,這幾個問題我推薦使用函數的形式完成,同時推薦一個操作格式,下麵將詳細介紹.

一.dataGridView刷新數據

如下圖所示,在數據庫中刪除一個數據或插入一個數據,我們都希望能夠在左邊的dataGridView控件中顯示操作後的內容,而使用dataGridView1.Refresh()刷新隻是刷新頁麵重繪控件,沒有從數據庫裏讀取內容.所以我們需要重新綁定數據,點擊按鈕故障信息刪除後,實現重新讀取數據庫的值,並顯示在控件dataGridView中即可.而這裏我采用自定義函數實現重新綁定數據.

 

代碼如下:

public void ShowInfoQues()
{
    //定義數據庫連接語句:服務器=.(本地) 數據庫名=a
    string consqlserver = "Data Source=.;Initial Catalog=a;Integrated Security=True;";
    string sql = "select * from Question";        //定義SQL查詢語句 
    DataSet ds = new DataSet();                   //定義數據內存中緩存
    SqlConnection con;                            //定義SQL Server連接對象
    SqlDataAdapter da;                            //數據庫命令和數據庫連接
    con = new SqlConnection(consqlserver);        //定義SQL Server連接對象
    da = new SqlDataAdapter(sql, con);            //數據庫命令和數據庫連接
    con.Open();
    try
    {
        da.Fill(ds);                                    //填充數據
        dataGridView1.DataSource = ds.Tables[0];        //獲取數據源賦值數據庫控件
    }
    catch (Exception msg)
    {
        MessageBox.Show(msg.Message);                   //異常處理
    }
    finally
    {
        con.Close();                    //關閉連接
        con.Dispose();                  //釋放連接
        da.Dispose();                   //釋放資源
    }
}

點擊按鈕"故障信息刪除"後調用該函數ShowInfoQues()即可實現,通常填充數據中需要判斷語句如下,如果插入到的結果存在時數據顯示在dataGridView控件中,但這樣會存在一個問題,當數據庫中隻存在一個數據時,刪除該數據後表中為空就不會更新dataGridView,因為此時已經沒有數據就不會執行dataGridView1.DataSource = ds.Tables[0].它會始終顯示一行數據,除非在此載入該窗體,所以此時不需要下麵判斷:

if (ds.Tables[0].Rows.Count > 0)         //判斷是否符合條件的數據記錄
{
    dataGridView1.DataSource = ds.Tables[0];    
}

在上麵代碼函數ShowInfoQues()中我設置為public,因為在點擊“故障信息導入”按鈕,它會進入另外一個界麵,在那個界麵填寫完要插入的數據後同時更新父窗口dataGridView控件中的數據,實現插入數據更新,其中子窗口中的構造函數將帶參數,如下圖所示是子界麵的代碼:

//父窗體custServ 父窗體中含函數ShowInfoQues()
custServ cstemp = new custServ();
public custServInput(custServ cs)
{
    InitializeComponent();
    cstemp = cs;
}
//點擊"確認添加"按鈕實現滿意度調查
private void button1_Click(object sender, EventArgs e)
{ 
    ...                        //插入數據操作
    cstemp.ShowInfoQues();     //父窗口刷新
    this.Hide();               //隱藏窗體
}

父窗體中的代碼如下:

//點擊"故障信息錄入"按鈕
private void repInf_Click(object sender, EventArgs e)
{
    custServInput cSI = new custServInput(this);
    cSI.Show();
}

二.數據庫主外鍵的判斷

在對數據庫進行操作時,通常會遇到判斷主鍵是否存在或是否重複的問題,或判斷外鍵是否存在的問題,因為如果外鍵不存在是不能插入數據的.在判斷主鍵與外鍵時,我們可以定義一個函數,通過調用這個函數進行判斷.

//該函數用於判斷表中Phoneid(手機序列號)是否存在
private bool IsPhoneIdentify()
{
    string consqlserver = "Data Source=.;Initial Catalog=TeleMS;Integrated Security=True;";
    string sql = "select * from Question where phoneid='" + textBox2.Text.Trim() + "'";
    SqlConnection Conn = new SqlConnection(consqlserver);   //定義SQL Server連接對象  
    Conn.Open();
    SqlCommand Cmd = new SqlCommand(sql, Conn);
    SqlDataReader reader = Cmd.ExecuteReader();             //數據庫命令和數據庫連接
    if (reader.Read())                                      //存在
    {
        return true;
    }
    else
    {
        return false;
    }
}

上麵代碼是判斷手機序列號是否存在,它通過判斷數據庫中phoneid=textBox2內容,如果存在返回true,如果不存在返回false並提示錯誤信息"該外鍵不存在,請驗證插入!"提示:使用try{..}catch(Exception msg){MessageBox.Show(msg.Message);}finally{..}時C#會自動生成異常信息,但通過自定義函數總體感覺更好,至少讓我們能更好的了解數據庫原理及常見的操作錯誤.

三.推薦格式源代碼

 通過上麵的敘述,可能你還不知道怎樣使用這些函數在對數據庫進行操作時進行一些簡單的判斷,下麵通過需要插入如圖數據,其中主外鍵表明:

我推薦的代碼如下:

//點擊"確認記錄"按鈕實現滿意度調查
private void button1_Click(object sender, EventArgs e)
{
    if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == "")
    {
        MessageBox.Show("請輸入顧客身份證號、售後人員編號和手機序列號!", "信息提示",
                System.Windows.Forms.MessageBoxButtons.OK,
                System.Windows.Forms.MessageBoxIcon.Warning);
    }
    else if (IsCusIdentify() == false)   //顧客身份證號重複(主鍵)
    {
        MessageBox.Show("該顧客身份證號已經存在,請驗證輸入!", "錯誤提示",
            System.Windows.Forms.MessageBoxButtons.OK,
            System.Windows.Forms.MessageBoxIcon.Warning);
    }
    else if (IsPhoneIdentify() == false)  //手機序列號不存在(外鍵)
    {
        MessageBox.Show("該手機序列號不存在,請驗證輸入!", "錯誤提示",
            System.Windows.Forms.MessageBoxButtons.OK,
            System.Windows.Forms.MessageBoxIcon.Warning);
    }
    else if (IsUserIdentify() == false)   //售後人員編號不存在(外鍵)
    {
        MessageBox.Show("該售後人員編號錯誤,請驗證!", "錯誤提示",
            System.Windows.Forms.MessageBoxButtons.OK,
            System.Windows.Forms.MessageBoxIcon.Warning);
    }
    else if (MessageBox.Show("確認要添加該進貨訂單信息?", "驗證提示",
        System.Windows.Forms.MessageBoxButtons.YesNo,
        System.Windows.Forms.MessageBoxIcon.Question)==System.Windows.Forms.DialogResult.Yes)
    {
        //實現插入數據操作
        string sqlInsert = string.Format(@"insert into ServiceInfo...");
        string consqlserver = "Data Source=.;Initial Catalog=a;Integrated Security=True;";
        SqlConnection cons = new SqlConnection(consqlserver);   //定義SQL Server連接對象  
        SqlCommand cmd = new SqlCommand(sqlInsert, cons);       //執行一個SQL語句
        try
        {
            cons.Open();                                        //打開連接
            cmd.ExecuteNonQuery();                              //返回執行SQL語句的行數
            MessageBox.Show("顧客手機使用滿意情況調查數據記錄成功!", "信息提示",
                System.Windows.Forms.MessageBoxButtons.OK,
                System.Windows.Forms.MessageBoxIcon.Information);
            csrmtemp.ShowInfoQues();                            //父窗口刷新
            this.Hide();                                        //隱藏窗體
        }
        catch (Exception msg)
        {
            MessageBox.Show(msg.Message);                       //異常處理
        }
        finally
        {
            cons.Close();                                       //關閉連接
            cons.Dispose();                                     //釋放連接
            cmd.Dispose();                                      //釋放資源
        }
    }
}

四.總結

上麵的排版可能有點亂,可能寫得不是很好!但作者盡力了.原本想分成兩篇寫的,但因為上麵敘述的幾點是最近做項目同時遇到的一些知識,所以就同時寫了.主要從dataGridView和主外鍵兩個方麵敘述,通過自己認為比較好的代碼,傳遞給大家一些東西.希望大家能學到有用的知識,作者已盡力,如果有不足和不喜歡的地方,見諒!

(By:Eastmount 2013-9-8 夜11點https://blog.csdn.net/eastmount)

最後更新:2017-04-03 15:21:43

  上一篇:go BASH SHELL快速入門
  下一篇:go Bash學習筆記