我在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()];
}
}
如何根据条件将值添加到新列。
答案 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);
}