1

私はデータグリッド (grid_detail) を持っています。今はその 1 行だけを読み取り、以下のコードを使用してデータベースに保存しているためです。

            //number of columns actually in second dgv
            int col_no = grid_detail.ColumnCount;
            int row_no = grid_detail.RowCount - 1; 
            int r = 0;



            //array to contain the values of the cells
            string[] col_value = new string[100];
            for (i = 0; i < col_no; i++) 
            {
                //fill in the Array with values from cells
                col_value[i] = Convert.ToString(grid_detail.Rows[0].Cells[i].Value);
            }
            //Build insert command 
            StringBuilder Q = new StringBuilder();
            Q.Append("INSERT INTO ");
            Q.Append("[Ref].[");
            Q.Append(_lstview_item);
            Q.Append("]");
            Q.Append(" VALUES");
            Q.Append("(");
            for (i = 0; i < col_no; i++)
            {
                Q.Append("'");
                if (string.IsNullOrEmpty(col_value[i]))
                {
                    x = false;
                    break;
                }
                else
                {
                    Q.Append(col_value[i]);
                    Q.Append("'");
                    Q.Append(",");
                    x = true;
                }
            }
            //removing last COMMA from loop
            if (col_no > 0)
            {
                Q.Length--;
            }
            Q.Append(")");
            query = Q.ToString();



            if (x == true)
            {
                //open connection to db and send query
                SqlConnection conn = new SqlConnection(cc.connectionString(cmb_dblist.Text));
                SqlCommand cmd_server = new SqlCommand(query);
                cmd_server.CommandType = CommandType.Text;
                cmd_server.Connection = conn;
                conn.Open();
                cmd_server.ExecuteNonQuery();
                conn.Close(); 

ただし、私の要件は、z グリッドの複数の行を読み取り、データベースに保存することです。次のような行数のforループを使用してみました

for (r=0;r<row_no;r++)
{

/////CODES ABOVE PASTED HERE

}

ループができません。

助けてください。

4

1 に答える 1

1

row_nogrid_detail 行数に従って設定したと仮定し、以下の変更を行ってテストします

for (int r=0; r< grid_detail.RowCount; r++)
{
    // your code...
    //int r = 0; comment this line 
    // your code...
    //.............
            for (i = 0; i < col_no; i++) 
            {
                //fill in the Array with values from cells
                col_value[i] = Convert.ToString(grid_detail.Rows[r].Cells[i].Value); // use row r 
            }
    //.............
    // your code...

}

しかし、私はあなたのコードを以下にリファクタリングします

foreach (GridViewRow row in GridView1.Rows)
{
    string sql = GenerateSql(row);
    if (!string.IsNullOrEmpty(sql))
        ExecuteNonQuery(sql);
}
private void ExecuteNonQuery(string query)
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    using (SqlCommand cmd_server = new SqlCommand(query, conn))
    {
        conn.Open();
        cmd_server.ExecuteNonQuery();
    }
}

private string GenerateSql(GridViewRow row)
{
    var values = row.Cells.Cast<TableCell>().Select(x => x.Text).ToArray();
    if (values.Any(string.IsNullOrEmpty))
    {
        return string.Empty;
    }
    var sql = string.Format("INSERT INTO  [Ref].[{0}] VALUES ({1})", _lstview_item, string.Join(",", values));

    return sql;    

}
于 2013-08-22T05:34:07.870 に答える