从数据表更新有界datagridview的插入数据

时间:2018-09-21 12:55:56

标签: c# visual-studio-2013 datagridview .net-4.0

我已从SQL Server数据库的 // To check if service is enabled public boolean isAccessibilitySettingsOn(Context mContext) { int accessibilityEnabled = 0; final String service = getPackageName() + "/" + CustomAccessiblityService.class.getCanonicalName(); try { accessibilityEnabled = Settings.Secure.getInt( mContext.getApplicationContext().getContentResolver(), android.provider.Settings.Secure.ACCESSIBILITY_ENABLED); Log.v(getString(R.string.app_name), "accessibilityEnabled = " + accessibilityEnabled); //accessibilityEnabled = Settings.Secure.getInt(this.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED); } catch (Settings.SettingNotFoundException e) { Log.e(getString(R.string.app_name), "Error finding setting, default accessibility to not found: " + e.getMessage()); } TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':'); if (accessibilityEnabled == 1) { Log.v(getString(R.string.app_name), "***ACCESSIBILITY IS ENABLED*** -----------------"); String settingValue = Settings.Secure.getString( mContext.getApplicationContext().getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); if (settingValue != null) { mStringColonSplitter.setString(settingValue); while (mStringColonSplitter.hasNext()) { String accessibilityService = mStringColonSplitter.next(); Log.v(getString(R.string.app_name), "-------------- > accessibilityService :: " + accessibilityService + " " + service); if (accessibilityService.equalsIgnoreCase(service)) { Log.v(getString(R.string.app_name), "We've found the correct setting - accessibility is switched on!"); return true; } else{ startActivityForResult(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS), 0); } } } } else { Log.v(getString(R.string.app_name), "***ACCESSIBILITY IS DISABLED***"); startActivityForResult(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS), 0); } return false; } 绑定了datagridview

我需要知道如何制作更新按钮,单击该按钮可以更新datatable内的已编辑数据

如果有新行,直接将行添加到datagridview并将其插入数据库 如果以前的边界数据有更新,请更新

我搜索了,但我不太了解如何做

  1. 为什么必须使用datagridview

  2. 为什么必须使用DataAdpterReader的{​​{1}}集合,而我已经有一个Dataset

谢谢

3 个答案:

答案 0 :(得分:2)

如果要使DataGirdView中的行反映在数据库中,只需使用@interface ZeroIntrinsicSizeView : UIView @end @implementation ZeroIntrinsicSizeView - (CGSize)intrinsicContentSize { return CGSizeZero; } @end 对象的方法。

简单地说,DataAdapterDataAdapter对象为您提供了一种轻松有效的数据库读写方法。除此之外,他们还可以在不影响实际数据库表的情况下完成所有这些操作,这意味着一切都保持不变,直到您这样说为止。

对于此示例,假设我们有一个名为 contacts 的SQL表,其中包含三列,分别是 fname mname lname

要开始工作,我们需要一个可用于从“联系人”表中获取数据的函数。

DataReader

然后您可以通过执行以下操作将DGV绑定到存储在返回的数据集对象中的表

    protected DataSet GetData()
    {
        // our select query to obtain all the rows from the contacts table
        string selectQuery = "SELECT * FROM contacts";

        // Where the data from the underlying table will be stored
        DataSet ds = new DataSet();

        // Connect to the database and get the data from the "contacts" table
        using (SqlConnection conn = new SqlConnection(connString))
        {
            using (SqlDataAdapter da = new SqlDataAdapter(selectQuery, conn))
            {
                da.Fill(ds, "contacts"); // Add the rows from the "contacts" table to our dataset
            }
        }

        return ds;
    }

在您的form_load事件中。

现在,我们已经完成了从数据库中获取数据的方法的设置,现在,我们已经建立了一种处理现有数据的方法。

DGV_Items.DataSource = GetData();

以上方法将处理所有数据操作。它将基于对绑定到DGV的DataTable对象所做的更改来执行操作。最后,您可以调用我们在 update 按钮的事件处理程序中创建的所有方法。

    protected void UpdateTable(DataSet ds)
    {
        SqlConnection conn = new SqlConnection(connString);

        // Insert, update and delete queries
        string updateQuery = "UPDATE contacts SET fname=@first,mname=@middle,lname=@last WHERE ID=@id";
        string deleteQuery = "DELETE FROM contacts WHERE ID=@id";
        string insertQuery = "INSERT INTO contacts VALUES(@first,@middle,@last)";

        // Create the parameters for the queries above
        SqlParameter[] insertParams = new SqlParameter[]
        {
            // the first parameter (e.g. @first) has to match with the declaration in the query

            // the second parameter (e.g.SqlDbType.NVarChar) is the data type of the actual column in the source table

            // the third paramter (e.g. 100) is the length of the data in the database table's column

            // the last parameter (e.g. "fname") is the DataPropertyName of the source column which is
            // basically the name of the database table column that the DGV column represents

            new SqlParameter("@first", SqlDbType.NVarChar, 100, "fname"),
            new SqlParameter("@middle", SqlDbType.NVarChar, 100, "mname"),
            new SqlParameter("@last", SqlDbType.NVarChar, 100, "lname")
        };

        SqlParameter[] updateParams = new SqlParameter[]
        {
            new SqlParameter("@first", SqlDbType.NVarChar, 100, "fname"),
            new SqlParameter("@middle", SqlDbType.NVarChar, 100, "mname"),
            new SqlParameter("@last", SqlDbType.NVarChar, 100, "lname"),
            new SqlParameter("@id", SqlDbType.Int, 100, "id")
        };

        SqlParameter[] DeleteParams = new SqlParameter[]
        {
            new SqlParameter("@id", SqlDbType.Int, 100, "id")
        };

        // Create the SqlCommand objects that will be used by the DataAdapter to modify the source table
        SqlCommand insertComm = new SqlCommand(insertQuery, conn);
        SqlCommand updateComm = new SqlCommand(updateQuery, conn);
        SqlCommand deleteComm = new SqlCommand(deleteQuery, conn);

        // Associate the parameters with the proper SqlCommand object
        insertComm.Parameters.AddRange(insertParams);
        updateComm.Parameters.AddRange(updateParams);
        deleteComm.Parameters.AddRange(DeleteParams);

        // Give the DataAdapter the commands it needs to be able to properly update your database table
        SqlDataAdapter dataAdapter = new SqlDataAdapter()
        {
            InsertCommand = insertComm,
            UpdateCommand = updateComm,
            DeleteCommand = deleteComm
        };

        // A DataTable and a DataSet are basically the same. Except the DataSet is a collection of DataTables
        // Here, you can see that we've accessed a specific DataTable in the DataSet.

        // Calling the Update method executes the proper command based on the modifications to the specified
        // DataTable object then commits these changes to the database
        dataAdapter.Update(ds.Tables["contacts"]);
    }

编辑

连同Crowcoder的建议,这是写我上面写的所有内容的更好方法:

    private void Btn_Update_Click(object sender, EventArgs e)
    {
        // Grab the DGV's data source which contains the information shown in the DGV
        DataSet ds = (DataSet)dgv_items.DataSource;
        // Have any updates to the said dataset committed to the database
        UpdateTable(ds);
        // rebind the DGV
        dgv_items.DataSource = GetData();
    }

要使用此类,只需编写以下内容即可创建一个实例:

/// <summary>
/// A collection of methods for easy manipulation of the data in a given SQL table
/// </summary>
class DBOps
{
    // The connection string contains parameters that dictate how we connect to the database
    private string connString = ConfigurationManager.ConnectionStrings["contactsConnectionString"].ConnectionString;

    // The table the instance of the class will be interacting with
    private string srcTable;

    // The SqlConnection Object that we will be using to connect to the database
    SqlConnection conn;

    // The DataAdapter object that we will be using to interact with our database
    SqlDataAdapter da;

    // The DataSet that we will be storing the data retrieved from the database
    DataSet ds;

    // The queries we would be using to manipulate and interact with the data in the database
    private string selectQuery;
    private string updateQuery;
    private string deleteQuery;
    private string insertQuery;

    // The collection of parameters for the queries above
    private SqlParameter[] insertParams;
    private SqlParameter[] updateParams;
    private SqlParameter[] DeleteParams;

    // The command objects that will be used by our data adapter when
    // interacting with the database
    private SqlCommand insertComm;
    private SqlCommand updateComm;
    private SqlCommand deleteComm;

    /// <summary>
    /// Initialize a new instance of the DBOps class
    /// </summary>
    /// <param name="tableName">The name of the table that the object will be interacting with</param>
    public DBOps(string tableName)
    {
        // Initialize the SqlConnection object
        conn = new SqlConnection(connString);

        // Initialize our collection of DataTables
        ds = new DataSet();

        srcTable = tableName;

        // initialize the query strings
        selectQuery = string.Format("SELECT * FROM {0}", srcTable);
        insertQuery = string.Format("INSERT INTO {0}(fname, mname, lnmae) VALUES(@first, @middle, @last", srcTable);
        updateQuery = string.Format("UPDATE {0} SET fname=@first, mname=@middle, lname=@last WHERE ID=@id", srcTable);
        deleteQuery = string.Format("DELETE FROM {0} WHERE ID=@id", srcTable);

        // Initialize the collection of parameters for each query above
        insertParams = new SqlParameter[]
        {
            // new SqlParameter(@paramName, paramDataType, paramValueLength, DGVDataPropertyName);
            new SqlParameter("@first", SqlDbType.NVarChar, 100, "fname"),
            new SqlParameter("@middle", SqlDbType.NVarChar, 100, "mname"),
            new SqlParameter("@last", SqlDbType.NVarChar, 100, "lname")
        };

        updateParams = new SqlParameter[]
        {
            new SqlParameter("@first", SqlDbType.NVarChar, 100, "fname"),
            new SqlParameter("@middle", SqlDbType.NVarChar, 100, "mname"),
            new SqlParameter("@last", SqlDbType.NVarChar, 100, "lname"),
            new SqlParameter("@id", SqlDbType.Int, 100, "id")

        };

        DeleteParams = new SqlParameter[]
        {
            new SqlParameter("@id", SqlDbType.Int, 100, "id")
        };

        // Initialize the SqlCommand objects that will be used by the DataAdapter to modify the source table
        insertComm = new SqlCommand(insertQuery, conn);
        updateComm = new SqlCommand(updateQuery, conn);
        deleteComm = new SqlCommand(deleteQuery, conn);

        // Associate the parameters with the proper SqlCommand object
        insertComm.Parameters.AddRange(insertParams);
        updateComm.Parameters.AddRange(updateParams);
        deleteComm.Parameters.AddRange(DeleteParams);

        // Give the DataAdapter the commands it needs to be able to properly update your database table
        da = new SqlDataAdapter()
        {
            InsertCommand = insertComm,
            UpdateCommand = updateComm,
            DeleteCommand = deleteComm
        };
    }

    /// <summary>
    /// Retrieve the data from the SQl table
    /// </summary>
    /// <returns></returns>
    public DataSet GetData()
    {
        DataSet ds = new DataSet();

        // Connect to the database and get the data from the "contacts" table
        using (conn)
        {
            conn.Open();
            using (SqlDataAdapter da = new SqlDataAdapter(selectQuery, conn))
            {
                da.Fill(ds); // Add the rows from the "contacts" table to our dataset
            }
        }

        return ds;
    }

    /// <summary>
    /// Commit the changes present in the object's DataSet to the Database
    /// </summary>
    public void UpdateData(DataSet ds)
    {
        // Calling the Update method executes the proper command based on the modifications to the specified
        // DataTable object
        da.Update(ds.Tables[srcTable]);
    }

更新按钮的click事件处理程序中,您可以通过调用 UpdateData 方法将对DGV的基础数据所做的所有更改提交。

DBOps ops = new DBOps("contacts");

总结一下:

  • private void Btn_Update_Click(object sender, EventArgs e) { // Grab the DGV's data source which contains the information shown in the DGV DataSet ds = (DataSet)dgv_items.DataSource; // Have any updates to the said dataset committed to the database ops.UpdateData(ds); // rebind the DGV dgv_items.DataSource = ops.GetData(); } DataAdapter对象为您提供了一些方法,这些方法将使您能够以安全,高效和简便的方式与数据库进行交互。
  • DataReaderDataTable几乎相同。除了DataSet仅是一个表,而DataTableDataSet的集合。另一方面,它们每个都具有其他人没有的特定方法。

答案 1 :(得分:0)

如果我理解正确,您只需要执行相同的查询即可重新填充“刷新”网格,即OnClick-执行上面的代码。我不太了解您的if子句?如果有新的?新数据?您要将其添加到数据库吗?您可以将该功能添加到此OnClick事件中,以将存在的任何内容写入数据库,无论是否更改,这实际上取决于您要呈现的数据量,因此解决方案可能会有所不同。

答案 2 :(得分:0)

我想出了解决方案,我制作了一种方法来获取所有数据并将其添加到数据集中的数据表中,如下面的示例所示

public DATEaSet GetDATEa()
{
    string connStr = ConfigurationManager.ConnectionStrings["connstr"].ToString();
    string cmdStr = @"SELECT  SEQ,
                                       ID,
                                       DATE,
                                       Started,
                                       END,
                                       TYPE,
                                       ENTRANCE,
                                       OUTGOING
                               FROM LOGING
                        WHERE SICK_ID=@ID;";

    SqlConnection conn = new SqlConnection(connStr);
    using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
    {
        try
        {
            conn.Open();
            cmd.CommandText = cmdStr;
            cmd.CommandType = CommandType.Text;

            ds = new DATEaSet();
            cmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.Int)).Value = Convert.ToInt32(TB_ID.Text);
            da = new SqlDATEaAdapter(cmd);

            da.Fill(ds, "DATEaTable1");
            MyDGV.Columns["MyDGV_RowNum"].DATEaPropertyName = ds.Tables["DATEaTable1"].Columns["SEQ"].ColumnName;
            MyDGV.Columns["MyDGV_SessionID"].DATEaPropertyName = ds.Tables["DATEaTable1"].Columns["ID"].ColumnName;
            MyDGV.Columns["MyDGV_DATEe"].DATEaPropertyName = ds.Tables["DATEaTable1"].Columns["DATE"].ColumnName;
            MyDGV.Columns["MyDGV_StartTime"].DATEaPropertyName = ds.Tables["DATEaTable1"].Columns["Started"].ColumnName;
            MyDGV.Columns["MyDGV_EndTime"].DATEaPropertyName = ds.Tables["DATEaTable1"].Columns["END"].ColumnName;
            MyDGV.Columns["MyDGV_Type"].DATEaPropertyName = ds.Tables["DATEaTable1"].Columns["TYPE"].ColumnName;
            MyDGV.Columns["MyDGV_CreatedBy"].DATEaPropertyName = ds.Tables["DATEaTable1"].Columns["ENTRANCE"].ColumnName;
            MyDGV.Columns["MyDGV_EntryDATEe"].DATEaPropertyName = ds.Tables["DATEaTable1"].Columns["OUTGOING"].ColumnName;

            return ds;
        }
        catch (Exception ex)
        {
            string ErrorMsg = ex.Message.Substring(0, Math.Min(ex.Message.Length, 1024));
            MessageBox.Show(ErrorMsg);
            return null;
        }
    }
}

Form_Load事件中,我已将Datagridview的DataSource设置为从上述方法返回的DS

请注意,在某些情况下,您必须明确设置DataMember

MyDGV.DataSource = GetPatientSessions();
MyDGV.DataMember = "DATEaTable1";

现在,当用户编辑或向datagridview添加行,然后按保存按钮时,下面的方法将更新编辑数据并插入输入的新行

private void BTN_Save_Click(object sender, EventArgs e)
{
    using (SqlCommandBuilder cmdbuilder = new SqlCommandBuilder(da))
    {
        try
        {
            da.Update(ds, "DATEaTable1");
        }
        catch (Exception ex)
        {
            string ErrorMsg = ex.Message.Substring(0, Math.Min(ex.Message.Length, 1024));
            MessageBox.Show(ErrorMsg);
        }
    }
}