值未添加到数据集的新列

时间:2013-01-15 12:30:08

标签: c# datatable

我在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()];

            }
        }

如何根据条件将值添加到新列。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作,在选择'' AS Title中创建一个空列然后填充它。你也可以把你的逻辑放在sql中(加入一个items表。):

    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()];

        }
    }

答案 1 :(得分:1)

您可以缩短第一部分(+使用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);
}