U¿ytkownik "KPH said:
Yes, I would like to update data from client data to database.
Why I have problem when update data with Expression property of column?
What is the root cause of this situation?
Well, I know it is imposible using DataAdapter object, but you can do it in
this way (unfortunely a bit more writing):
public class MyTest
{
private SqlConnection myConn = new SqlConnection(
"server=(local);database=testy;" +
"Integrated Security=SSPI;");
private DataTable myDt = new DataTable("Orders");
private SqlDataAdapter myDa;
public MyTest()
{
myDa = new SqlDataAdapter(
"Select IdOrd, OrdName, Quantity, Price " +
"From Orders2", myConn);
}
public void LoadData()
{
myDa.Fill(myDt);
//autoincrement
myDt.Columns["IdOrd"].AutoIncrement = true;
//expression column
myDt.Columns.Add("Value",
typeof(System.Decimal), "Quantity * Price");
}
public void AddSomeData()
{
DataRow dr = myDt.NewRow();
dr["OrdName"] = "bread";
dr["Quantity"] = 2;
dr["Price"] = 3;
myDt.Rows.Add(dr);
}
public void UpdateDb()
{
//first inserted row
SqlCommand myInsCom = GetInsCommand();
SqlCommand myUpdCom;// = GetUpdCommand();
myConn.Open();
foreach(DataRow dr in myDt.Select("", "" ,
DataViewRowState.Added))
{
//settings parameters value
myInsCom.Parameters["@OrdN"].Value = dr["OrdName"];
myInsCom.Parameters["@Quant"].Value = dr["Quantity"];
myInsCom.Parameters["@Price"].Value = dr["Price"];
myInsCom.Parameters["@Val"].Value = dr["Value"];
//fire insert
myInsCom.ExecuteNonQuery();
}
//then updated rows etc...
foreach(DataRow dr in myDt.Select("", "" ,
DataViewRowState.ModifiedCurrent
| DataViewRowState.ModifiedOriginal))
{
//settings parameters value
//myUpdCom.ExecuteNonQuery();
}
//delete on finish...
myConn.Close();
myDt.AcceptChanges();
}
private SqlCommand GetInsCommand()
{
SqlCommand insCom;
insCom = new SqlCommand(
"Insert Into Orders2 (OrdName, Quantity, Price, Value) " +
"Values (@OrdN, @Quant, @Price, @Val)", myConn);
//define parameters
insCom.Parameters.Add("@OrdN", SqlDbType.VarChar, 50);
insCom.Parameters.Add("@Quant", SqlDbType.Int, 0);
insCom.Parameters.Add("@Price", SqlDbType.Money, 50);
insCom.Parameters.Add("@Val", SqlDbType.Money, 50);
return insCom;
}
}
But I'm not sure if updating database in so way (by data computed in
expression column) is really correct idea.
Regards,
Grzegorz
Ps.
Actual Order table:
Create Table Orders (
IdOrd Int Identity(1,1) Primary Key,
OrdName Varchar(50),
Quantity Int,
Price Money,
Value Money
)