请教专家指点迷津,在 C#里面,针对datagrid 的数据保存方式有哪些? 我一般是在点击更新的时候,调用 sql 语句,对某条进行单独的更新;有同事说可以对整个datatable 进行更新,然后在更新到数据库里面去。请问第2 种方式具体是怎么实现的? 并且在对datagrid 进行编辑,保存的时候,保存到数据库里面去的方法还有哪些?谢谢!谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 提供一点思路#region "Just for congigruable form" private static readonly string UpdateSql = "Update {0} set {1} {2}"; private static readonly string SetSql = "{0} = @{0}"; private static readonly string WhereSql = "where {0} = @{0}"; private static readonly string where2 = "where {0} = '{1}'"; private static readonly string InsertSql = "Insert {0}({1}) values({2})"; private static readonly string DeleteSql = "Delete * from {0} {1}"; private static readonly string SelectSql = "Select * from {0} {1}"; public static DataTable GetTableData(string TableName, Guid ID) { //PrimaryKey Column Name = TableName + "ID" string PKName = TableName + "ID"; string where = string.Format(where2, PKName, ID ); string select = string.Format(SelectSql, TableName, where); DataTable dtb = ExecuteDataset(select).Tables[0]; dtb.TableName = TableName; return dtb; } public static bool ExistRowByID( string tableName, Guid Id ) { string PKName = tableName + "ID"; string where = string.Format(where2, PKName, Id ); string select = string.Format(SelectSql, tableName, where); object o = ExecuteScalar( select ); if( o == null ) { return false; } else { return true; } } public static DataTable GetEmptyTable(string TableName,int rowCount) { Guid ID = System.Guid.NewGuid(); DataTable dt = GetTableData(TableName, ID); string PKName = TableName + "ID"; DataRow dr; for( int i=0; i< rowCount; i++ ) { dr = dt.NewRow(); dr[PKName] = ID; dt.Rows.Add( dr ); } //InsertTableData( dt ); return dt; } public static void UpdateTableData(DataTable dtb) { string TableName = dtb.TableName; string PKName = TableName + "ID"; StringBuilder values = new StringBuilder(); string Where = string.Empty; for (int k=0; k<dtb.Columns.Count; ++k) { if (dtb.Columns[k].ColumnName == PKName) { Where = string.Format(WhereSql, PKName); continue; } values.AppendFormat(SetSql, dtb.Columns[k].ColumnName); if (k < dtb.Columns.Count-1) { values.Append(", "); } } for (int i=0; i<dtb.Rows.Count; ++i) { System.Data.IDataParameter[] parameters = GetDataParameters(dtb, i); string sql = string.Format(UpdateSql, TableName, values.ToString(), Where); ExecuteScalar(sql, parameters); } } public static void InsertTableData(DataTable dtb) { string TableName = dtb.TableName; string PKName = TableName + "ID"; StringBuilder insertValues = new StringBuilder(); StringBuilder cloumn_list = new StringBuilder(); for (int k=0; k<dtb.Columns.Count; ++k) { cloumn_list.Append(dtb.Columns[k].ColumnName); insertValues.Append("@"+dtb.Columns[k].ColumnName); if (k < dtb.Columns.Count-1) { cloumn_list.Append(","); insertValues.Append(","); } } for (int i=0; i<dtb.Rows.Count; ++i) { System.Data.IDataParameter[] parameters = GetDataParameters(dtb, i); string sql = string.Format(InsertSql, TableName, cloumn_list.ToString(), insertValues.ToString()); ExecuteScalar(sql, parameters); } } public static void DeleteTableData(string TableName, string ID) { string PKName = TableName + "ID"; string where = string.Format(where2, PKName, ID); string sql = string.Format(DeleteSql, TableName, where); ExecuteScalar(sql); } private static System.Data.IDataParameter[] GetDataParameters(DataTable dtb, int rowIndex) { //PrimaryKey Column Name = TableName + "ID" string PKName = dtb.TableName + "ID"; System.Data.IDataParameter[] param = new System.Data.IDataParameter[dtb.Columns.Count]; for (int i=0; i<dtb.Columns.Count; ++i) { param[i] = new System.Data.SqlClient.SqlParameter(); param[i].ParameterName = string.Format("@{0}", dtb.Columns[i].ColumnName); param[i].DbType = GetDbType(dtb.Columns[i].DataType); param[i].Value = dtb.Rows[rowIndex][i]; } return param; } private static System.Data.DbType GetDbType(Type type) { DbType result = DbType.String; if( type.Equals( typeof(int) ) || type.IsEnum ) result = DbType.Int32; else if( type.Equals( typeof(long) ) ) result = DbType.Int32; else if( type.Equals( typeof(double) ) || type.Equals( typeof(Double) ) ) result = DbType.Decimal; else if( type.Equals( typeof(DateTime) ) ) result = DbType.DateTime; else if( type.Equals( typeof(bool) ) ) result = DbType.Boolean; else if( type.Equals( typeof(string) ) ) result = DbType.String; else if( type.Equals( typeof(decimal) ) ) result = DbType.Decimal; else if( type.Equals( typeof(byte[]) ) ) result = DbType.Binary; else if( type.Equals( typeof(Guid) ) ) result = DbType.Guid; return result; } #endregionpublic static object ExecuteScalar(string sql){ return db.ExecuteScalar(System.Data.CommandType.Text ,sql);} 还可以用适配器Adapter.适配器是建立数据库数据与内存数据集的映射的桥梁,通过适配器即可将数据库中的数据加载到内存中去,也可以将内存中的更新或增加的数据保存到数据库中,所以可以利用适配器来实现保存数据到数据库中的方法,但是要注意数据库数据与内存中数据的一致性.如果是sql连接数据库的话,那么SqlDataAdapter就是这种连接下的数据适配器,我给几句保存数据的关键代码://连接数据库部分(略)....DataSet ds = new DataSet();SqlDataAdapter adapter = new SqlDataAdapter(sqlcommand,sqlconnection);//将执行返回的数据结果装载到内存的数据集中,并取名该结果为表tablenameadapter.Fill(ds,"tablename");//若ds中的数据发生了更新DataSet changedData = this.ds.GetChanges();if (changedData != null){//更新数据库int changedRows = adapter.Update(changedData);MessageBox.Show("数据库成功更新了" + changedRows + "条记录", "成功",MessageBoxButtons.OK,MessageBoxIcon.Information);//更新数据集ds.AcceptChanges();}具体的你可以查查msdn或这方面的书籍. 不太明白你同事所说的据我所知道的对编辑1.注册datagrid的edit事件,点编辑时修改数据2.把datagrid的绑定列改为模板列,直接绑定,修改数据对数据收集1.把收集到数据直接传到一个method2.把数据收集到一个datatable/datarow,再传到一个method3.把数据收集到一个class里,再传到一个method对数据更新1.手动生成sql语句2.调用储存过程3.使用SqlCommandBuilder生成update语句,再用SqlDataAdapter.Update()来更新 //我用的时候经常碰到并发冲突,很少用唱首歌过来听听先~~~~~~~~~~~~~~ 对数据更新 3 可以显式指定更新所用的sql语句或储存过程 简单的事件、委托代码无法编译通过 dataSet数据的监视问题 求助: 4个checkbox获取值得问题 一个古怪问题 有VC6的DLL,在C#里能够调用,脱离开发环境,调用不成功,如何解决? 100分求教:用C#做Windows Form控件的时候,如何自定义控件的工作区 .net 开发 电子地图网站的技术分析 用CrystalReportViewer查看报表时启动特别慢,快来帮帮我呀 一个简单问题(急). 请教visual studio bate2中文版安装问题? 我该怎么选择?请各位发表看法! 小弟愚蠢!不知道装了win2003为什么不能运行.net程序
#region "Just for congigruable form" private static readonly string UpdateSql = "Update {0} set {1} {2}";
private static readonly string SetSql = "{0} = @{0}";
private static readonly string WhereSql = "where {0} = @{0}";
private static readonly string where2 = "where {0} = '{1}'";
private static readonly string InsertSql = "Insert {0}({1}) values({2})";
private static readonly string DeleteSql = "Delete * from {0} {1}";
private static readonly string SelectSql = "Select * from {0} {1}"; public static DataTable GetTableData(string TableName, Guid ID)
{
//PrimaryKey Column Name = TableName + "ID"
string PKName = TableName + "ID";
string where = string.Format(where2, PKName, ID );
string select = string.Format(SelectSql, TableName, where); DataTable dtb = ExecuteDataset(select).Tables[0];
dtb.TableName = TableName;
return dtb;
} public static bool ExistRowByID( string tableName, Guid Id )
{
string PKName = tableName + "ID";
string where = string.Format(where2, PKName, Id );
string select = string.Format(SelectSql, tableName, where); object o = ExecuteScalar( select );
if( o == null )
{
return false;
}
else
{
return true;
}
} public static DataTable GetEmptyTable(string TableName,int rowCount)
{
Guid ID = System.Guid.NewGuid();
DataTable dt = GetTableData(TableName, ID); string PKName = TableName + "ID";
DataRow dr; for( int i=0; i< rowCount; i++ )
{
dr = dt.NewRow();
dr[PKName] = ID;
dt.Rows.Add( dr );
}
//InsertTableData( dt ); return dt;
} public static void UpdateTableData(DataTable dtb)
{
string TableName = dtb.TableName;
string PKName = TableName + "ID";
StringBuilder values = new StringBuilder();
string Where = string.Empty;
for (int k=0; k<dtb.Columns.Count; ++k)
{
if (dtb.Columns[k].ColumnName == PKName)
{
Where = string.Format(WhereSql, PKName);
continue;
}
values.AppendFormat(SetSql, dtb.Columns[k].ColumnName);
if (k < dtb.Columns.Count-1)
{
values.Append(", ");
}
}
for (int i=0; i<dtb.Rows.Count; ++i)
{
System.Data.IDataParameter[] parameters = GetDataParameters(dtb, i);
string sql = string.Format(UpdateSql, TableName, values.ToString(), Where);
ExecuteScalar(sql, parameters);
}
} public static void InsertTableData(DataTable dtb)
{
string TableName = dtb.TableName;
string PKName = TableName + "ID"; StringBuilder insertValues = new StringBuilder();
StringBuilder cloumn_list = new StringBuilder();
for (int k=0; k<dtb.Columns.Count; ++k)
{
cloumn_list.Append(dtb.Columns[k].ColumnName);
insertValues.Append("@"+dtb.Columns[k].ColumnName);
if (k < dtb.Columns.Count-1)
{
cloumn_list.Append(",");
insertValues.Append(",");
}
} for (int i=0; i<dtb.Rows.Count; ++i)
{
System.Data.IDataParameter[] parameters = GetDataParameters(dtb, i);
string sql = string.Format(InsertSql, TableName, cloumn_list.ToString(), insertValues.ToString());
ExecuteScalar(sql, parameters);
}
} public static void DeleteTableData(string TableName, string ID)
{
string PKName = TableName + "ID";
string where = string.Format(where2, PKName, ID);
string sql = string.Format(DeleteSql, TableName, where);
ExecuteScalar(sql);
} private static System.Data.IDataParameter[] GetDataParameters(DataTable dtb, int rowIndex)
{
//PrimaryKey Column Name = TableName + "ID"
string PKName = dtb.TableName + "ID";
System.Data.IDataParameter[] param = new System.Data.IDataParameter[dtb.Columns.Count];
for (int i=0; i<dtb.Columns.Count; ++i)
{
param[i] = new System.Data.SqlClient.SqlParameter();
param[i].ParameterName = string.Format("@{0}", dtb.Columns[i].ColumnName);
param[i].DbType = GetDbType(dtb.Columns[i].DataType);
param[i].Value = dtb.Rows[rowIndex][i];
}
return param;
} private static System.Data.DbType GetDbType(Type type)
{
DbType result = DbType.String;
if( type.Equals( typeof(int) ) || type.IsEnum )
result = DbType.Int32;
else if( type.Equals( typeof(long) ) )
result = DbType.Int32;
else if( type.Equals( typeof(double) ) || type.Equals( typeof(Double) ) )
result = DbType.Decimal;
else if( type.Equals( typeof(DateTime) ) )
result = DbType.DateTime;
else if( type.Equals( typeof(bool) ) )
result = DbType.Boolean;
else if( type.Equals( typeof(string) ) )
result = DbType.String;
else if( type.Equals( typeof(decimal) ) )
result = DbType.Decimal;
else if( type.Equals( typeof(byte[]) ) )
result = DbType.Binary;
else if( type.Equals( typeof(Guid) ) )
result = DbType.Guid; return result;
} #endregion
public static object ExecuteScalar(string sql)
{
return db.ExecuteScalar(System.Data.CommandType.Text ,sql);
}
适配器是建立数据库数据与内存数据集的映射的桥梁,通过适配器即可将数据库中的数据加载到内存中去,也可以将内存中的更新或增加的数据保存到数据库中,所以可以利用适配器来实现保存数据到数据库中的方法,但是要注意数据库数据与内存中数据的一致性.
如果是sql连接数据库的话,那么SqlDataAdapter就是这种连接下的数据适配器,我给几句保存数据的关键代码:
//连接数据库部分(略)
....
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(sqlcommand,sqlconnection);
//将执行返回的数据结果装载到内存的数据集中,并取名该结果为表tablename
adapter.Fill(ds,"tablename");
//若ds中的数据发生了更新
DataSet changedData = this.ds.GetChanges();
if (changedData != null)
{
//更新数据库
int changedRows = adapter.Update(changedData);
MessageBox.Show("数据库成功更新了" + changedRows + "条记录", "成功",MessageBoxButtons.OK,MessageBoxIcon.Information);
//更新数据集
ds.AcceptChanges();
}具体的你可以查查msdn或这方面的书籍.
据我所知道的
对编辑
1.注册datagrid的edit事件,点编辑时修改数据
2.把datagrid的绑定列改为模板列,直接绑定,修改数据对数据收集
1.把收集到数据直接传到一个method
2.把数据收集到一个datatable/datarow,再传到一个method
3.把数据收集到一个class里,再传到一个method对数据更新
1.手动生成sql语句
2.调用储存过程
3.使用SqlCommandBuilder生成update语句,再用SqlDataAdapter.Update()来更新 //我用的时候经常碰到并发冲突,很少用唱首歌过来听听先~~~~~~~~~~~~~~