0

列を自分datatableに追加し、条件に基づいて列に値を追加しましたが、値が追加されませんdatatable(値があるはずですが)

これは私が使用したコードの一部です

conn = new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0;
                                Data Source =" + Server.MapPath("App_Data\\LR Product Database 2000.mdb"));
        conn.Open();

        Dictionary<string, string> items = new Dictionary<string, string>();
        OleDbCommand cmd = conn.CreateCommand();
        cmd.CommandText = "SELECT CODE, TITLE FROM tblProducts";

        OleDbDataReader dbread = cmd.ExecuteReader();

        while (dbread.Read())
        {
            productCode = (string)dbread["CODE"];
            productTitle = (string)dbread["TITLE"];
            System.Diagnostics.Debug.Write(productCode + " ");
            items.Add(productCode, productTitle);
        }

        sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["LRVWebsite"].ToString());
        sqlCon.Open();
        dsSql = new DataSet();
        SqlDataAdapter dba = new SqlDataAdapter(@"SELECT C.CustomerFirstName,C.CustomerLastName, C.CustomerCompany,C.CustomerPosition,C.CustomerCountry,C.CustomerProvince,C.CustomerContact,CP.ActionDate,CP.ProductCode,CP.CustomerEmail FROM tblCustomers C INNER JOIN tblCustomerProducts CP ON C.CustomerEmail = CP.CustomerEmail ORDER BY ActionDate DESC", connString);
        dba.Fill(dsSql,"Products");
        DataTable dt = dsSql.Tables["Products"];
        dt.Columns.Add("Title", typeof(string));

        foreach (DataRow dr in dt.Rows)
        {
            if(items.ContainsKey(dr["ProductCode"].ToString()))
            {

                dr["Title"] = items[dr["ProductCode"].ToString()];

            }
        }

条件に基づいて新しい列に値を追加するにはどうすればよいですか。

4

2 に答える 2

1

このようなことを行い、選択に空の列を作成してから入力することができます'' AS Title。ロジックを sql に入れることもできます (項目テーブルに結合します)。

    SqlDataAdapter dba = new SqlDataAdapter(@"SELECT '' as Title, C.CustomerFirstName,C.CustomerLastName, C.CustomerCompany,C.CustomerPosition,C.CustomerCountry,C.CustomerProvince,C.CustomerContact,CP.ActionDate,CP.ProductCode,CP.CustomerEmail FROM tblCustomers C INNER JOIN tblCustomerProducts CP ON C.CustomerEmail = CP.CustomerEmail ORDER BY ActionDate DESC", connString);
    dba.Fill(dsSql,"Products");
    DataTable dt = dsSql.Tables["Products"];

    foreach (DataRow dr in dt.Rows)
    {
        if(items.ContainsKey(dr["ProductCode"].ToString()))
        {

            dr["Title"] = items[dr["ProductCode"].ToString()];

        }
    }
于 2013-01-15T12:50:58.087 に答える
1

最初の部分を短くして (+ use using)、次を使用できますEnumerable.Join

DataTable tblAccess = new DataTable();
using(var con = new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0;Data Source =" + Server.MapPath("App_Data\\LR Product Database 2000.mdb"))
using(var da = new OleDbDataAdapter("SELECT CODE, TITLE FROM tblProducts", con))
{ 
    da.Fill(tblAccess);
}

DataTable tblSqlServer = new DataTable();
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["LRVWebsite"].ToString()))
using(var da = new SqlDataAdapter("SELECT C.CustomerFirstName,C.CustomerLastName, C.CustomerCompany,C.CustomerPosition,C.CustomerCountry,C.CustomerProvince,C.CustomerContact,CP.ActionDate,CP.ProductCode,CP.CustomerEmail FROM tblCustomers C INNER JOIN tblCustomerProducts CP ON C.CustomerEmail = CP.CustomerEmail ORDER BY ActionDate DESC", con))
{ 
    da.Fill(tblSqlServer);
}

これで、両方のテーブルを簡単に結合しLinq-To-DataSetて、sql-server 行の新しいタイトルを取得できます。

var both = from rowSql in tblSqlServer.AsEnumerable()
           join rowAcc in tblAccess.AsEnumerable()
           on rowSql.Field<string>("ProductCode") equals rowAcc.Field<string>("ProductCode")
           select new { rowSql = rowSql, newTitle = rowAcc.Field<string>("Title") };

foreach (var x in both)
{
    x.rowSql.SetField("Title", x.newTitle);
}
于 2013-01-15T12:52:04.973 に答える