编辑数据表并将其发送回数据库

时间:2017-01-27 21:56:14

标签: c#

使用我的程序,我有一个数据表,可以填充从数据库中获取的记录。这将显示在数据网格视图中,单击单元格时会将所有值加载到文本框中。单击保存按钮时,它会将文本框值保存回数据表中。但是,如何将此数据表发送回数据库并让它更新记录?

以下是加载记录的代码:

 indexRow = e.RowIndex;
        DataGridViewRow row = dgv_ReturnSearch.Rows[indexRow];

        tb_editFirstName.Text = row.Cells[1].Value.ToString();
        tb_editLastName.Text = row.Cells[2].Value.ToString();
        tb_editAge.Text = row.Cells[3].Value.ToString();
        tb_editPostCode.Text = row.Cells[4].Value.ToString();
        tb_editMobNum.Text = row.Cells[5].Value.ToString();
        tb_editEmail.Text = row.Cells[6].Value.ToString();
        tb_editAllergies.Text = row.Cells[7].Value.ToString();
        tb_editDOB.Text = row.Cells[8].Value.ToString();
        tb_editGender.Text = row.Cells[9].Value.ToString();

这是我保存它们的代码

DataGridViewRow newDataRow = dgv_ReturnSearch.Rows[indexRow];
            newDataRow.Cells[1].Value = tb_editFirstName.Text;
            newDataRow.Cells[2].Value = tb_editLastName.Text;
            newDataRow.Cells[3].Value = tb_editAge.Text;
            newDataRow.Cells[4].Value = tb_editPostCode.Text;
            Logic.SQLQueriesUtility.Adapter.Update(dt);

但是,这实际上并不更新数据库,只有本地数据表。当它再次加载时,所有更改都会恢复。

由于

3 个答案:

答案 0 :(得分:0)

要使用数据库中的数据加载# Find K Means of Loudacre device status locations # # Input data: file(s) with device status data (delimited by '|') # including latitude (13th field) and longitude (14th field) of device locations # (lat,lon of 0,0 indicates unknown location) # NOTE: Copy to pyspark using %paste # for a point p and an array of points, return the index in the array of the point closest to p def closestPoint(p, points): bestIndex = 0 closest = float("+inf") # for each point in the array, calculate the distance to the test point, then return # the index of the array point with the smallest distance for i in range(len(points)): dist = distanceSquared(p,points[i]) if dist < closest: closest = dist bestIndex = i return bestIndex # The squared distances between two points def distanceSquared(p1,p2): return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 # The sum of two points def addPoints(p1,p2): return [p1[0] + p2[0], p1[1] + p2[1]] # The files with device status data filename = "/loudacre/devicestatus_etl/*" # K is the number of means (center points of clusters) to find K = 5 # ConvergeDist -- the threshold "distance" between iterations at which we decide we are done convergeDist=.1 # Parse device status records into [latitude,longitude] rdd2=rdd1.map(lambda line:(float((line.split(",")[3])),float((line.split(",")[4])))) # Filter out records where lat/long is unavailable -- ie: 0/0 points # TODO filterd=rdd2.filter(lambda x:x!=(0,0)) # start with K randomly selected points from the dataset # TODO sample=filterd.takeSample(False,K,42) # loop until the total distance between one iteration's points and the next is less than the convergence distance specified tempDist =float("+inf") while tempDist > convergeDist: # for each point, find the index of the closest kpoint. map to (index, (point,1)) # TODO indexed =filterd.map(lambda (x1,x2):(closestPoint((x1,x2),sample),((x1,x2),1))) # For each key (k-point index), reduce by adding the coordinates and number of points reduced=indexed.reduceByKey(lambda x,y: ((x[0][0]+y[0][0],x[0][1]+y[0][1]),x[1]+y[1])) # For each key (k-point index), find a new point by calculating the average of each closest point # TODO newCenters=reduced.mapValues(lambda x1: [x1[0][0]/x1[1], x1[0][1]/x1[1]]).sortByKey() # calculate the total of the distance between the current points and new points newSample=newCenters.collect() #new centers as a list samples=zip(newSample,sample) #sample=> old centers samples1=sc.parallelize(samples) totalDistance=samples1.map(lambda x:distanceSquared(x[0][1],x[1])) # Copy the new points to the kPoints array for the next iteration tempDist=totalDistance.sum() sample=map(lambda x:x[1],samples) #new sample for next iteration as list sample ,您需要使用gridviewDataTable然后绑定网格。看起来应该是这样的:

DataAdapter

尝试直接更新数据库:

private void CustomersBindGrid()
{
    using (SqlConnection con = new SqlConnection(mycon))
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.CommandText = "SELECT * FROM Customers";
            cmd.Connection = con;

            DataTable dt = new DataTable();
            using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
            {
                sda.Fill(dt);
                Gridview1.DataSource = dt;
                Gridview1.DataBind();
            }
        }
        con.Close();
    }
}

您需要将此更新命令编辑到数据库中的列,并获取读取客户ID的方法,以便条件实际工作并更新数据库。

答案 1 :(得分:0)

在你的帖子中,你不会写,你的客户是如何发展的...... 通常,这将通过SQL更新命令完成 因此(在Microsoft Universe中)可以使用SqlClient(System.Data.SqlClient命名空间) 一旦用户按下保存按钮,您将超越变量中的相关textbox.text值,必要时更改数据类型,生成SQL更新字符串以更新SQL服务器上的数据。 示例SQL更新字符串:

Update TableName set ColumnName1Text = 'some text', ColumName2Integer = 12, ColumnName.... = ... where ColumnNameKey = KeyToDatatable

然后通过SqlClient(SqlCommand)将SQL命令(SQL更新字符串)提交给SQL服务器。
但是因此你需要一个where子句的唯一键(在示例KeyToDatatable中),以便只更新带有键的行。
通常从DataTable(与其他字段一起)查询密钥以显示数据(在您的网格中),然后接管到更新命令(可以&#34;隐藏&#34;来自用户,不要&#39; ; t必须知道密钥)。

答案 2 :(得分:0)

我设法解决了这个问题:

DataGridViewRow newDataRow = dgv_ReturnSearch.Rows[indexRow];
            dt.Rows[indexRow]["first_name"] = tb_editFirstName.Text;
            dt.Rows[indexRow]["last_name"] = tb_editLastName.Text;
            dt.Rows[indexRow]["age"] = tb_editAge.Text;
            dt.Rows[indexRow]["postcode"] = tb_editPostCode.Text;
            dt.Rows[indexRow]["mobile_num"] = tb_editMobNum.Text;
            dt.Rows[indexRow]["email"] = tb_editEmail.Text;
            dt.Rows[indexRow]["allergies"] = tb_editAllergies.Text;
            dt.Rows[indexRow]["DOB"] = tb_editDOB.Text;
            dt.Rows[indexRow]["gender"] = tb_editGender.Text;
            Logic.SQLQueriesUtility.Adapter.Update(dt);

而不是我以前做过的事情,现在它完美无缺,任何更改都会保存回数据库。