ITPub博客

首页 > 应用开发 > IT综合 > 使用SqlCommandBuilder更新DataTable的源代码

使用SqlCommandBuilder更新DataTable的源代码

原创 IT综合 作者:hljhrbsjf 时间:2006-09-14 16:27:57 0 删除 编辑
使用SqlCommandBuilder更新DataTable的源代码,你可以选择看,也可以不(技术共享) 首先说明一下,这一大堆东西是一堆共通函数拿出来的,由于时间仓促,所以有些地方还有很多改进的地方,个人认为很容易,看到老是有人问这些东西,所以特别贴出来,希望对大家有点帮助.
这个东西可能谁都会,但这是我自己的API,我拿出来共享,大家可以拿来就用.也可以编译成为Dll,在中国的软件环境中,我希望大家可以团结.

public void SaveDataFromDt(DataTable argdtData,string argstrTableName)//这里的参数就是要更新的DataTable和要更新的表名
{
if(argdtData ==null)
{
throw new Exception("DataTable不存在!");
}
//下面是初始化数据库连接自己设置吧
SqlConnection conn = new SqlConnection(“连接字符串,这个不用写了吧”);
SqlCommand scommGlobal;
Sql Transaction stracGlobal; //可以添加事物处理
SqlDataAdapter sdaGlobal;

//做一个DataTable,取数据库中表名和主键用的
DataTable dtColStat;

//初始化这个DataTable
dtColStat = new DataTable();
//下面这个东西个人人为是精华
scommGlobal = new SqlCommand("select distinct objs.name as tblname,cols.name as colname,cols.colstat as colstat"+" from sysobjects objs join syscolumns cols on (objs.id=cols.id) "+" where colstat='1'",sconnGlobal);

//可以设置TimeOut,随便写吧
scommGlobal.CommandTimeout = 1000;

//初始化事物
scommGlobal.Transaction = stracGlobal;
sdaGlobal = new SqlDataAdapter(scommGlobal, conn);
try
{
//打开数据连接,这个我就不写了
//这里拿到数据库中所有的表名和主键
sdaGlobal.Fill(dtColStat);
}
catch(System.Exception ex)
{
//异常处理,自己写吧
}
string strSelect; //准备用SelectCommand

string strStatColName=string.Empty; //准备得到的Column名称
string strColName=string.Empty; StringBuilder sbCols = new StringBuilder(128);
DataRow[] drs = dtColStat.Select("tblname='"+ argstrTableName+"'");
if(drs.Length>0)
{
strStatColName = drs[0]["colstat"].ToString();
}
//下面拼装Select语句,取出主键和要更新的所有Column
sbCols.Append("select ");
foreach(DataColumn dc in argdtData.Columns)
{
strColName = dc.ColumnName; if(strColName!=strStatColName)
{
sbCols.Append(strColName);
sbCols.Append(",");
}
}
if(sbCols.Length>7)
sbCols.Remove(sbCols.Length-1,1);
sbCols.Append(" from ");
sbCols.Append(argstrTableName);
strSelect = sbCols.ToString();

//设置SelectCommand
sdaGlobal.SelectCommand = new SqlCommand(strSelect,conn);
sdaGlobal.SelectCommand.Transaction = stracGlobal;

//重要的地方来了
SqlCommandBuilder scombuilder = new SqlCommandBuilder(sdaGlobal);
scombuilder.RefreshSchema();
//该生成可供执行的数据库操作命令
sdaGlobal.UpdateCommand = scombuilder.GetUpdateCommand();
sdaGlobal.InsertCommand = scombuilder.GetInsertCommand();
sdaGlobal.DeleteCommand = scombuilder.GetDeleteCommand();

//可以设置一把TimeOut,随便设置
sdaGlobal.UpdateCommand.CommandTimeout=1000;
sdaGlobal.InsertCommand.CommandTimeout=1000;
sdaGlobal.DeleteCommand.CommandTimeout=1000;

//可以加上你们事物
sdaGlobal.UpdateCommand.Transaction = stracGlobal;
sdaGlobal.DeleteCommand.Transaction = stracGlobal;
sdaGlobal.InsertCommand.Transaction = stracGlobal;
try
{
//数据库连接就自己去写吧
//可以进行更新了
sdaGlobal.Update(argdtData);
argdtData.AcceptChanges();
//关闭数据连接什么的,我也不写了,偷懒
}
catch(Exception ex)
{
//异常处理自己写
}
}
到此结束,由于时间太短和公司的不方便(系统不是中文的,郁闷ing,家里开这个网站象牛一样慢),所以到此为止,希望可以对大家有一些帮助,本人不是在炫耀什么,因为我越来越明白,技术共享对程序员来说是多么的重要(我需要的是完全的共享).由于是多个方法组合成了一个方法,所以可能会有不合适的地方,比如数据库连接,事物什么的以前都是全局变量,大家可以从命名上看出来,这些代码本人在.net2002和2003版本甚至是在2005微软2月预览版中测试都没问题,如果有问题希望大家可以DeBug一把,也就变量有些命名或者找不到什么的错误,但是中心部分都没有错误,如果大家需要原来完整的代码,我也可以贴出来,但是就太多了,还有别的逻辑在里面,比如说,在更新数据之前,要对DataTable中所有的数据进行EndEdit();当然还有检查DataTable中的数据有没有做过更改,如果没有更改就不进行任何更新,但是我都给省略了,祝大家好运.
[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/631872/viewspace-864908/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    115
  • 访问量
    526733