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

        }
    }
于 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 回答