zoukankan      html  css  js  c++  java
  • C# 讀取、新增、修改、刪除 數據庫資料方法

            /// <summary>
            
    /// 讀取SQL Server數據,使用DataSet
            
    /// </summary>
            private void DataSerConnection()
            {
                
    try
                {
                    
    // 1、
            /*
             * 使用SqlConnection连接数据库之前,首先需要建立数据库连接。
             * 为了建立数据库连接,需要创建SqlConnection实例,并通过SqlConnection类构造器或SqlConnection实例的属性初始化数据库连接字符串。
             * SqlConnection 與 SqlDataAdapter 或 SqlCommand一起使用
             */
                    //SqlConnection 表示與SQL Server 数据库的一个打开的连接。作用:控制到SQL Server的連接
                    
    //(如果有可用的開啟連接,則 SqlConnection 會從連接集區取出開啟的連接。否則,它會建立與 SQL Server 之執行個體的新連接。)
                    SqlConnection dataConnection = new SqlConnection();
                    
    //ConnectionString 取得或設定用來開啟 SQL Server 資料庫的字串。
                    dataConnection.ConnectionString = "Data Source=CCM02\\SQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=sh2_123";
                    
    //Open 開啟資料庫連接。 
                    dataConnection.Open();


                    
    //SqlDataAdapter 表示一組資料命令集和資料庫連接
                    /*
                     * 初始化 SqlDataAdapter 類別的新執行個體
                     * 名稱                            說明
                        SqlDataAdapter ()                                     初始化 SqlDataAdapter 類別的新執行個體。 
                        SqlDataAdapter (SqlCommand)                  使用指定 SqlCommand 做為 SelectCommand 屬性,初始化 SqlDataAdapter 類別的新執行個體。 
                        SqlDataAdapter (String, SqlConnection)      使用 SelectCommand 和 SqlConnection 物件,初始化 SqlDataAdapter 類別的新執行個體。 
                        SqlDataAdapter (String, String)                   使用 SelectCommand 和連接字串,初始化 SqlDataAdapter 類別的新執行個體。 
                     
    */

                    // 2、
                    SqlDataAdapter suppliersTableAdapter = new SqlDataAdapter("select * from products", dataConnection);

                    
    /*
                     * 成員名稱 說明 
                        DataReader  從基礎資料儲存區中擷取資料做為 IDataReader  
                        DataSet        從基礎資料儲存區中擷取資料至 DataSet 結構中。
                     
    */

                    // 3、
                    DataSet dt = new DataSet();
                    dt.DataSetName 
    = "Northwind";


                    
    /*
                     * 名稱                                            說明  
                        DataAdapter.FillSchema (DataSet, SchemaType)                                   將 DataTable 加入至指定的 DataSet,並且根據指定的 SchemaType 設定結構描述,以符合資料來源中的資料表。                      
                        DataAdapter.FillSchema (DataTable, SchemaType, IDataReader)           將 DataTable 加入指定的 DataSet。                      
                        DataAdapter.FillSchema (DataSet, SchemaType, String, IDataReader)    將 DataTable 加入指定的 DataSet。 
                     * 
                     * SchemaType :指定如何在執行 FillSchema 作業時處理現有的結構描述 (Schema) 對應。 
                     * 成員名稱 說明 
                         Mapped       套用所有的現有資料表對應至內送的結構描述 (Schema)。使用變形的結構描述來設定 DataSet。  
                         Source         忽略在 DataAdapter 上的任何資料表對應。使用內送的結構描述來設定 DataSet,而不套用任何的變形。               
                     
    */

                    
    // 4、
                    suppliersTableAdapter.Fill(dt, "products");

                    
    /*
                     * BindingSource
                     * 封裝表單的資料來源。
                     * 名稱                  說明  
                        BindingSource ()                        初始化 BindingSource 類別的新執行個體成為預設屬性值。 
                        BindingSource (IContainer)         初始化 BindingSource 類別的新執行個體,並將 BindingSource 加入指定的容器中。 
                        BindingSource (Object, String)    使用指定的資料來源和資料成員,初始化 BindingSource 類別的新執行個體。 
                     
    */

                    // 5、
                    BindingSource bd = new BindingSource(dt, "products");

                    
    //在界面上顯示資料
                    
    //dgvData: DataGridView控件
                    
    //取得或設定 DataGridView 顯示資料的資料來源。
                    dgvData.DataSource = bd;

                    //6、

                    dataConnection.Close();
                    
    //釋放所使用的所有資源。
                    suppliersTableAdapter.Dispose();

                }
                
    catch (Exception e)
                {
                    
    throw e;
                }
            }

            /// <summary>
            
    /// 用DataReader讀取數據
            
    /// </summary>
            private void CommandConnection()
            {
                
    try
                {
                    SqlConnection sqlConn 
    = new SqlConnection();
                    sqlConn.ConnectionString 
    = "Data Source=CCM02\\SQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=sh2_123";
                    sqlConn.Open();

                    SqlCommand sqlComad 
    = new SqlCommand();
                    sqlComad.CommandType 
    = CommandType.Text;
                    sqlComad.Connection 
    = sqlConn;
                    sqlComad.CommandText 
    = "select * from products";

                    
    //SqlDataReader:從數據庫獲取行
                    SqlDataReader sqlDr = sqlComad.ExecuteReader();
                    
    //FieldCount  取得目前資料列中的資料行數目。
                    DataTable dt = new DataTable();

                    
    int iDrCount = sqlDr.FieldCount;
                    
    for (int iCnt = 0; iCnt < iDrCount; iCnt++)
                    {
                        
    string a = sqlDr.GetName(iCnt);
                        dt.Columns.Add(a);
                        
    //dt.Rows.Add((DataRow)sqlDr[iCnt]);
                    }
                    
    //將DataReader前進到下一個資料
                    while (sqlDr.Read())
                    { 
                        
    //定義一個數組,便於讀出每一行資料
                        String[] subitems = new String[iDrCount];
                        
    //用循環讀出每一行資料
                        for (int iCnt = 0; iCnt < iDrCount; iCnt++)
                        {
                            
    //讀出每一行資料保存到數組中
                            subitems[iCnt] = sqlDr[iCnt].ToString();
                            
    string sValue = sqlDr[iCnt].ToString();  
                        }
                        
    //將讀出的行資料增表的行中
                        dt.Rows.Add(subitems);
                    }
                    
    //DataGridView的來源為“dt”這個表
                    dgvData.DataSource = dt;

                    sqlDr.Close();
                    sqlComad.Dispose();
                    sqlConn.Close();
                }
                
    catch (Exception e)
                {
                    
    throw e;
                }
            }
     

            /// <summary>
            /// 用表進行填充DataGridView
            
    /// </summary>
            private void DataTableCommandConnect()
            {
                DataTable dtb 
    = new DataTable();

                SqlConnection sqlConn 
    = new SqlConnection();
                sqlConn.ConnectionString 
    = "Data Source=CCM02\\SQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=sh2_123";
                sqlConn.Open();

                SqlCommand sqlCmd 
    = new SqlCommand();
                sqlCmd.CommandType 
    = CommandType.Text;
                sqlCmd.CommandText 
    = "select * from products";
                sqlCmd.Connection 
    = sqlConn;

                SqlDataAdapter sqlDapter 
    = new SqlDataAdapter();
                sqlDapter.SelectCommand 
    = sqlCmd;


                dtb.Clear();
                
    //將讀出的資料填充一表dtb中
                sqlDapter.Fill(dtb);

                
    //DataGridView的來源為“dt”這個表
                dgvData.DataSource = dtb;

                sqlConn.Close();
                sqlCmd.Dispose();
                sqlDapter.Dispose();
            }

            /// <summary>
            
    /// 保存已修改的資料
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            private void btnSave_Click(object sender, EventArgs e)
            {
                
                DataSet dsChanges 
    = (DataSet)dtSet.GetChanges();
                
    if (dsChanges==null)
                {
                    
    return;
                }

                DataTable dtb 
    = new DataTable();
                dtb 
    = dsChanges.Tables["products"];
                
    //GetErrors方法返回一個數組,它由表中具一個或多個檢驗錯誤的行構成。如沒有誤返加空數組
                DataRow[] badRows = dtb.GetErrors();

                
    if (badRows.Length==0)
                {
                    
    //int numRows = suppliersTableAdapter.Update(dsChanges, "products");
                    
    //要在需要时生成所需的命令,必须创建 SqlCommandBuilder 对象的实例并使用该构造函数中的 DataAdapter。
                    //1、

                    SqlCommandBuilder sqlbuiler = new SqlCommandBuilder();
                    sqlbuiler.DataAdapter 
    = suppliersTableAdapter;

                    //2、

                    SqlConnection dataConnection = new SqlConnection();
                    dataConnection.ConnectionString 
    = "Data Source=CCM02\\SQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=sh2_123";

                    
    //dataConnection.Open();

                    
    string sCmdText = "select * from products";
                    
    //3、
                    SqlCommand sqlComad = new SqlCommand();
                    
    //指出CommandText讀取方式
                    sqlComad.CommandType = CommandType.Text;
                    
    //Connection:連接資料庫的Connection
                    sqlComad.Connection = dataConnection;
                    
    //CommandText:取得或設定要針對資料來源執行的文字命令。
                    sqlComad.CommandText = sCmdText;

                    
    //4、
                    
    //suppliersTableAdapter.SelectCommand = new SqlCommand("select * from products ", dataConnection);
                    
    //SelectCommand 取得或設定用來在資料來源中選取資料錄的命令。
                    suppliersTableAdapter.SelectCommand = sqlComad;
                    
    //取得或設定接資料庫的Connection
                    
    //取得或設定用來將新的資料錄插入至資料來源的命令。 
                    
    //GetInsertCommand:取得在資料來源上執行插入時所需之自動產生的 DbCommand 物件。
                    suppliersTableAdapter.InsertCommand = sqlbuiler.GetInsertCommand();
                    suppliersTableAdapter.UpdateCommand 
    = sqlbuiler.GetUpdateCommand();
                    suppliersTableAdapter.DeleteCommand 
    = sqlbuiler.GetDeleteCommand();


                    
    //5、
                    int numRows = suppliersTableAdapter.Update(dsChanges, "products");

                    
    if (numRows>0)
                    {
                        MessageBox.Show(
    "Update" + numRows + "rows""Success");
                        
    //變更資料
                        dtSet.AcceptChanges();
                    }
                    
    else
                    {
                        
    //返原所有更
                        dtSet.RejectChanges();
                    }

                    
    //清除與這個 DbCommandBuilder 關聯的命令。 
                    sqlbuiler.RefreshSchema();
                    
    //關閉聯接
                    dataConnection.Close();
                    
    //釋放資源
                    sqlComad.Dispose();
                    sqlbuiler.Dispose();
                }
                
    else
                {
                    
    string errorMsg = null;
                    
    foreach (DataRow row in badRows)
                    {
                        
    //每一行都可能一個或多個誤,而GetColumnsInError方法將返加一個集合,其中包含了數據有問題的所有例
                        foreach (DataColumn col in row.GetColumnsInError())
                        {
                            
    //GetColumnError方法獲取一個無效的列的錯誤消息。每一條錯誤消息都附加到errorMsg字符串上。
                            errorMsg += row.GetColumnError(col) + "\n";
                        }
                    }
                    MessageBox.Show(
    "Errors in data:" + errorMsg, "please fix", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

            /// <summary>
            
    /// 新增按鈕,新增一個空行
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            private void btnAdd_Click(object sender, EventArgs e)
            {
                
    if (dgvData.DataSource!=null)
                {
                    bd.AddNew();
                }            
            }

            /// <summary>
            
    /// 刪除按鈕,刪當前資料
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            private void btnDelete_Click(object sender, EventArgs e)
            {
                
    int iSelectRowCount = dgvData.SelectedRows.Count;
                
    int iSelectCellCount = dgvData.SelectedCells.Count;
                
    int iOldCellIndex = 0;
                
    if (iSelectCellCount>0)
                {
                    
    //判斷是否是選擇了行
                    if (iSelectRowCount>0)
                    {
                        
    //循環刪除行
                         foreach (DataGridViewRow dgvRow in dgvData.SelectedRows)
                         {
                             dgvData.Rows.Remove(dgvRow);
                         }
                         MessageBox.Show(
    "Delete" + iSelectRowCount + "rows""Success");
                    }

                    
    // 判斷是否是擇了存儲格
                    if (dgvData.SelectedCells.Count>0)
                    {
                        
    //定義一個ArrayList存放行資料
                        ArrayList al = new ArrayList();
                        
    //循環存儲格,得到行Index存入ArrayList
                        foreach (DataGridViewCell dgvCell in dgvData.SelectedCells)
                        {
                            
    /*IndexOf:搜尋指定的 Object,並傳回在整個 ArrayList 中第一個符合元素之以零起始的索引。 
                            如果有找到,則是在整個 ArrayList 內,value 第一次出現的以零起始的索引,否則為 -1。 
                             
    */
                            
    if (al.IndexOf(dgvCell.RowIndex) == -1)
                            {
                                
    //將行號增加到數組中
                                al.Add(dgvCell.RowIndex);
                            }
                        }
                        
    foreach (int iIndex in al)
                        {
                            dgvData.Rows.RemoveAt(iIndex);
                        }
                    }
                }

                
    #region 當選擇行時,刪除該行

                
    //int iSelectRowCount = dgvData.SelectedRows.Count;
                
    //if (dgvData.SelectedRows.Count > 0)
                
    //{
                
    //    foreach (DataGridViewRow dgvRow in dgvData.SelectedRows)
                
    //    {
                
    //        dgvData.Rows.Remove(dgvRow);
                
    //    }
                
    //    MessageBox.Show("Delete" + iSelectRowCount + "rows", "Success");
                
    //}

                
    #endregion

                
    #region 當選擇存儲格時,刪除該存儲的行
                
    //當選擇的存儲格大於0時(即選擇了多行)
                
    //if (dgvData.SelectedCells.Count >0)
                
    //{
                
    //    int iSelectCellsCount = dgvData.SelectedCells.Count;
                
    //    //刪除方法1
                
    //    foreach (DataGridViewCell dgvCell in dgvData.SelectedCells)
                
    //    {
                
    //        int iRowIndex = dgvCell.RowIndex;
                
    //        dgvData.Rows.RemoveAt(iRowIndex);
                
    //    }

                    
    //刪除方法2
                    
    //循環刪除時的方法,(要先刪除前一筆,在刪除下一筆,要不然會出錯)
                    
    //for (int iCellsCount = iSelectRowCount-1; iCellsCount >=0 ; iCellsCount--)
                    
    //{
                    
    //    int iRowIndex = dgvData.SelectedCells[iCellsCount].RowIndex;
                    
    //    //取得所選資料行的索引
                    
    //    dgvData.Rows.RemoveAt(iRowIndex);
                    
    //}
                
    //}
                #endregion


                    
    //刪除當前資料行 方法1
                    
    //dgvData.Rows.Remove(dgvData.CurrentRow);
                    
    //刪除當前資料行 方法2
                    
    //dgvData.Rows.RemoveAt(dgvData.CurrentCell.RowIndex);
                    
    //刪除當前資料行 方法3
                    
    //bd.RemoveCurrent();
            }




  • 相关阅读:
    NIS详解
    Linux的硬链接和软链接有何区别?
    使用sed和cut将进程的pid过滤出来
    sticky(粘附位)的含义
    使用ulimit来产生core dump文件
    Linux常用shell脚本
    LFS5.0安装完成心得
    sshd + xinetd 限制IP登录
    Linux磁盘限额配置(Ext3)
    LFS安装手记
  • 原文地址:https://www.cnblogs.com/scottckt/p/889780.html
Copyright © 2011-2022 走看看