SqlCommandBuilder 批量更新问题(十万火急)

时间:2022-10-25 20:40:43
    public DataSet UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
    {
   
  
      SqlConnection  conn = new SqlConnection(strConnection);
      SqlCommand myCommand = new SqlCommand("select * from " + strTblName, conn);   

      SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );   

      SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);     
      
      myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand();
       try
       {
          conn.Open();
          myAdapter.Update(ds,strTblName);
          ds.AcceptChanges();
          conn.Close();
          return ds;    //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds 
       }
     catch(Exception err)
     { 

          conn.Close(); 
          throw err;
     }
   }
为什么这段代码执行过后数据库里并没有插入任何记录啊!~(代码网上转的)谢谢大哥们帮我找找那里错啊!~ 找出来马上给分
小弟谢谢了
十万火急啊!~

11 个解决方案

#1


-_-! 好像在Winform里面用的吧。

#2


没有看到有insert 的sql语句啊,
上面是select 查询吧

#3


参考:
http://www.cnblogs.com/slcfhr/archive/2006/07/20/455579.html
http://dev.csdn.net/article/75832.shtm

#4


#5



SqlDataAdapter ad = new SqlDataAdapter("select top 1 * from users where 1<>1", sqlconn);//取个结构
DataTable dt = new DataTable();
SqlCommandBuilder cmb = new SqlCommandBuilder(ad);//这一句很关键,必不可少。
ad.Fill(dt);
int i;
for (i = 1; i < 10; i++)
{
     DataRow dr = dt.NewRow();
     dr["uid"] = "nid" + i.ToString();
     dt.Rows.Add(dr);
}
ad.Update(dt);


Fill方法可以自动的打开关闭数据库,不用自己写OPEN的~

#6


给你我的测试过程~~

1.建立表test~表中只有一列ID,int型~

2.建立控制台项目InsertData~

3.代码如下~


using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace InsertData
{
    class Program
    {
        static void Main(string[] args)
        {
            string sqlconn = "server=127.0.0.1;user id=sa;password=xxx;database=test;";
            SqlDataAdapter ad = new SqlDataAdapter("select top 1 * from test where 1<>1", sqlconn);//取个结构
            DataTable dt = new DataTable();
            SqlCommandBuilder cmb = new SqlCommandBuilder(ad);//这一句很关键,必不可少。
            ad.Fill(dt);
            for (int i = 1; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["id"] = i;
                dt.Rows.Add(dr);
            }
            ad.Update(dt);
            Console.WriteLine("OK");
            Console.Read();
        }
    }
}


运行后test表中有10行新加入数据~


OVER~

#7


up!楼上!

#8


行状态不对呗.确保你传入的ds中DataRow的行状态为Added.

#9


public DataSet UpdateByDataSet(DataSet ds,string strTblName,string strConnection) 
    { 
      SqlConnection  conn = new SqlConnection(strConnection); 
      SqlCommand myCommand = new SqlCommand("select * from " + strTblName, conn);  
      SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );  
      SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);        
      myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand(); 
      try 
      { 
          foreach(DataRow dr in ds.Tables[0].Rows)
          {
                 dr.SetAdded();//.net 2.0以上版本才有,如果你是.net 1.1那没此方法
          }//加上这段代码后看能插入吗.这个是把行状态置成了Added
          conn.Open(); 
          myAdapter.Update(ds,strTblName); 
          ds.AcceptChanges(); 
          conn.Close(); 
          return ds;    //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds 
      } 
    catch(Exception err) 
    { 
          conn.Close(); 
          throw err; 
    } 
  } 

#10


正如6楼代码那样.先填充一个空的DataTable,然后再向table中添加行.这样每个行的行状态都会是Added
只有行状态对了.才会调用相应的sql语句去执行命令.

另外还要确保你的SqlCommandBuilder 能正确生成insert语句

#11


我空间有个现成实例,你看看!
http://113620916.qzone.qq.com/infocenter?ADUIN=113620916&ADSESSION=1231373422&ADTAG=CLIENT.QQ.1881_QQUrlReportBlankZone.0

#1


-_-! 好像在Winform里面用的吧。

#2


没有看到有insert 的sql语句啊,
上面是select 查询吧

#3


参考:
http://www.cnblogs.com/slcfhr/archive/2006/07/20/455579.html
http://dev.csdn.net/article/75832.shtm

#4


#5



SqlDataAdapter ad = new SqlDataAdapter("select top 1 * from users where 1<>1", sqlconn);//取个结构
DataTable dt = new DataTable();
SqlCommandBuilder cmb = new SqlCommandBuilder(ad);//这一句很关键,必不可少。
ad.Fill(dt);
int i;
for (i = 1; i < 10; i++)
{
     DataRow dr = dt.NewRow();
     dr["uid"] = "nid" + i.ToString();
     dt.Rows.Add(dr);
}
ad.Update(dt);


Fill方法可以自动的打开关闭数据库,不用自己写OPEN的~

#6


给你我的测试过程~~

1.建立表test~表中只有一列ID,int型~

2.建立控制台项目InsertData~

3.代码如下~


using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace InsertData
{
    class Program
    {
        static void Main(string[] args)
        {
            string sqlconn = "server=127.0.0.1;user id=sa;password=xxx;database=test;";
            SqlDataAdapter ad = new SqlDataAdapter("select top 1 * from test where 1<>1", sqlconn);//取个结构
            DataTable dt = new DataTable();
            SqlCommandBuilder cmb = new SqlCommandBuilder(ad);//这一句很关键,必不可少。
            ad.Fill(dt);
            for (int i = 1; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["id"] = i;
                dt.Rows.Add(dr);
            }
            ad.Update(dt);
            Console.WriteLine("OK");
            Console.Read();
        }
    }
}


运行后test表中有10行新加入数据~


OVER~

#7


up!楼上!

#8


行状态不对呗.确保你传入的ds中DataRow的行状态为Added.

#9


public DataSet UpdateByDataSet(DataSet ds,string strTblName,string strConnection) 
    { 
      SqlConnection  conn = new SqlConnection(strConnection); 
      SqlCommand myCommand = new SqlCommand("select * from " + strTblName, conn);  
      SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand );  
      SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);        
      myAdapter.InsertCommand = myCommandBuilder .GetInsertCommand(); 
      try 
      { 
          foreach(DataRow dr in ds.Tables[0].Rows)
          {
                 dr.SetAdded();//.net 2.0以上版本才有,如果你是.net 1.1那没此方法
          }//加上这段代码后看能插入吗.这个是把行状态置成了Added
          conn.Open(); 
          myAdapter.Update(ds,strTblName); 
          ds.AcceptChanges(); 
          conn.Close(); 
          return ds;    //数据集的行状态在更新后会都变为: UnChange,在这次更新后客户端要用返回的ds 
      } 
    catch(Exception err) 
    { 
          conn.Close(); 
          throw err; 
    } 
  } 

#10


正如6楼代码那样.先填充一个空的DataTable,然后再向table中添加行.这样每个行的行状态都会是Added
只有行状态对了.才会调用相应的sql语句去执行命令.

另外还要确保你的SqlCommandBuilder 能正确生成insert语句

#11


我空间有个现成实例,你看看!
http://113620916.qzone.qq.com/infocenter?ADUIN=113620916&ADSESSION=1231373422&ADTAG=CLIENT.QQ.1881_QQUrlReportBlankZone.0