当前位置:编程学习 > C#/ASP.NET >>

请教 ADO.net 问题 SqlDataAdapter 的 InsertCommand 用法

怎么使用SqlDataAdapter.InsertCommand来插入数据?
我写的执行以后没有反应哎..
看了很多书都没有说
请好心人指点

<各变量均已声明>
            dataset = new DataSet();
            datatable = new DataTable("test");
            dtAdapt = new SqlDataAdapter("select * from exam", connection);//假设已经连接成功了
            dtAdapt.Fill(dataset,"test");

            comm =new SqlCommand("insert exam values(testID,testName)", conn);//假设SQL句也没错
            dtAdapt.InsertCommand = comm;
            dtAdapt.Update(dataset,"exam");
           
            MessageBox.Show("插入成功!");
            

--------------------编程问答--------------------
dtAdapt.InsertCommand.ExecuteNonQuery();
--------------------编程问答-------------------- insert exam values(testID,testName)testID,testName是字符串类型吗?是的话改为:
insert exam values('"+testID+"','"+testName+"'). --------------------编程问答--------------------   comm =new SqlCommand("insert exam values(testID,testName)", conn);//假设SQL句也没错

偏偏你这个sql就错了

insert exam(字段1,字段2) valuse(testID,testName);


dtAdapt.Update(dataset,"exam");//这里也不对 更新时这里要填的Dataset中要更新到数据库的表名称 而不是数据库表名称 因此你这里应该是 dtAdapt.Update(dataset,"test");

--------------------编程问答-------------------- 谢谢lilopeng
         不过,这样和直接用command有什么区别呢?
         不是可以自动updata到数据库么?

谢谢hackenliu 
         我自己的程序所有异常都捕获了,没有的话也会提示,我在程序里就是那种写法 --------------------编程问答-------------------- 谢谢jiatong1981 
               insert   exam   values(testID,testName) T-sql有这种写法的,不信你拿查询分析器试试

另外:dtAdapt.Update(dataset, "exam ");这里是个比误,我从程序复制过来的时候没有改这个地方
如果不同,调试器会报错的.我的没有 --------------------编程问答-------------------- 单步调试吧,自己找看哪步执行的和自己预期的不一样 --------------------编程问答-------------------- 谢谢harryheart

不过我查了几本书,MSDN也看过了,没有语法段,也没有示例程序,挺....

也试过调试,无果,所以才来请教了. --------------------编程问答-------------------- MSDN有代码的
 粘个给你
下面的示例使用派生类 OleDbDataAdapter 来更新数据源。

public DataSet CreateCmdsAndUpdate(DataSet dataSet, string connectionString,
    string queryString, string tableName) 
{
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        OleDbDataAdapter adapter = new OleDbDataAdapter();
        adapter.SelectCommand = new OleDbCommand(queryString, connection);
        OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);

        connection.Open();

        DataSet customers = new DataSet();
        adapter.Fill(customers);

        //code to modify data in dataset here

        adapter.Update(customers, tableName);

        return customers;
    }
}  
--------------------编程问答-------------------- 非常感谢你的热心
其实我之前看过了.
其实我是想知道可以单一的在sql[oleDb]DataAdapter.XXXXCommand里写语句达到插入,更新或删除,的效果.
就是取代在DataSet.tables里newRow然后插入

实际上,我调试发现我贴的程序在dataSet里面没有变动(没有插入记录)
那像insertCommand等属性在sqlDataAdapt里起的作用是什么

还有builderCommand起的作用就是自动生成各种操作的XXXXcommand吗?
报着这些疑问,我才起手写测试程序的

刚学这个,疑问很多,请见谅 --------------------编程问答-------------------- 呵呵,我也是新手
 不过比较下代码
发现在update前有个fill的操作
 是否应该在 dtAdapt.Update(dataset,"exam");前先fill一下? --------------------编程问答--------------------             dataset = new DataSet();
            datatable = new DataTable("test");
            dtAdapt = new SqlDataAdapter("select * from exam", connection);//假设已经连接成功了
            dtAdapt.Fill(dataset,"test");

            comm =new SqlCommand("insert exam values(testID,testName)", conn);//假设SQL句也没错
            dtAdapt.InsertCommand = comm;
            dtAdapt.Update(dataset,"exam");
           
            MessageBox.Show("插入成功!");

你的testID和testName是不是变量名阿

 
comm =new SqlCommand("insert exam values("& testID & ",'" & testName & "')", conn);//假设SQL句也没错


不好意思我就会vb.net的语法,你看看是不是这个原因让你没办法更新



--------------------编程问答-------------------- 而且你执行后看看数据库是不是改变了? --------------------编程问答--------------------  comm =new SqlCommand("insert exam values(testID,testName)", conn);//假设SQL句也没错
//insert into exam values(testID,testName) --------------------编程问答--------------------
我有一下问题总结:
insertCommand里的String值是一个声明而已吗?
因为从程序到数据库间做一个转换操作,但是用用sqlCommand可以先直接构造sqlCommand对象的SQL String参数里动态的给出控件的值然后用ExecuteNonQuery方法就能更新到数据库
如果SqlDataAdapter里的insertCommand属性起的作用不是Command的text的话,那他用处在哪里?

因为像上面贴的程序里面一样
是用OleDbCommandBuilder把selectCommand的转成insertCommand(模糊的可以那么说)
这样就在多操作的时候不用重写每个更新,插入,删除的SQL而是让OleDbCommandBuilder生成
但是和直接给OleDbCommandBuilder.insertCommand也是一样的
这样看来和我贴的程序也一样

//code to modify data in dataset here
难道还是要用具体用DataSet手动操作?
还不是很多此一举吗?因为好几本书上直接更改了DataSet然后就用用了Updata方法更新了(有先sqlCommandBuilder)




--------------------编程问答--------------------
comm =new SqlCommand("insert into exam values("& testID & ",'" & testName & "')", conn);//假设SQL句也没错
--------------------编程问答-------------------- 是否应该在   dtAdapt.Update(dataset, "exam ");前先fill一下?

我有,fill就是先用查询语句限定返回的集合然后填充进数据集里 --------------------编程问答-------------------- comm =new SqlCommand("insert exam values("& testID & ",'" & testName & "')", conn);

这个不是和c#应用变量的时候两边写+号一样吗?

我觉得真的不是SQL的问题,因为我程序里面是用+然后接我文本框控件的Text值的 --------------------编程问答-------------------- 而且你执行后看看数据库是不是改变了?

看了,查询和企业管理器都进过了

不过想想也知道DataSet没插入的话Updata也不会让数据库更新

所以我就再想我一定对哪句语句理解错误 --------------------编程问答--------------------   comm   =new   SqlCommand( "insert   exam   values(testID,testName) ",   conn);//假设SQL句也没错 
//insert   into   exam   values(testID,testName)
谢谢
-----------------------
- -为什么都怀疑我的SQL语句错了
在SQl联机帮助里面into是被打上了[]号的,就是说可以省略掉
我数据库的建表,而且还用这个语句先插入了2条测试记录然后select过了
真的..我用RP保证,SQL没错 --------------------编程问答-------------------- 研究了一个下午..未果
心情有点郁闷啊
现在要去上其他课了

希望大家继续帮助我,回复答案,感激不尽

对大家的热情,非常感动>_< --------------------编程问答-------------------- -0-居然没有回复了!!!

NO~~~~~~ --------------------编程问答-------------------- insert语句 在查询分析器里不通过!
服务器: 消息 128,级别 15,状态 1,行 1
在此上下文中不允许使用 'testID'。此处只允许使用常量、表达式或变量。不允许使用列名。
--------------------编程问答-------------------- string insCmd="insert into exam values(@testID,@testName)";
dtAdapt.InsertCommand=new SqlCommand(insCmd,conn);
SqlParameter sp=new SqlParameter();
sp=dtAdapt.InsertCommand.Parameters.Add("@testID",SqlDbType.Int);
sp.SourceColumn="testID";//注意段名与数据库相同
sp.SourceVersion=DataRowVersion.Current;

sp=dtAdapt.InsertCommand.Parameters.Add("@testName",SqlDbType.VarChar);
sp.SourceColumn="testName";
sp.SourceVersion=DataRowVersion.Current;
if(dataset.HasChanges())
{
try
{
dtAdapt.Update(dataset,"exam");
MessageBox.Show("成功!");
}
catch(Exception ex)
{
MessageBox.Show("失败"+ex.Message);
}
}
else
{
MessageBox.Show("请填写数据");
}

呵呵,写了这么多不知你能不能看懂,我觉得你的第五句以后有问题,所有我把第五句以后都替换了.还有一点你的数据表要有记录插入.
试试看,行不行.祝你开心!^_^ --------------------编程问答-------------------- 参照用Vs2003中数据组件OleDbDataAdapter向导自动生成的代码 --------------------编程问答-------------------- comm =new SqlCommand("insert exam values(@testID,@testName)", conn);//假设SQL句也没错

以下是例子



public static SqlDataAdapter CreateCustomerAdapter(
    SqlConnection connection)
{
    SqlDataAdapter adapter = new SqlDataAdapter();

    // Create the SelectCommand.
    SqlCommand command = new SqlCommand("SELECT * FROM Customers " +
        "WHERE Country = @Country AND City = @City", connection);

    // Add the parameters for the SelectCommand.
    command.Parameters.Add("@Country", SqlDbType.NVarChar, 15);
    command.Parameters.Add("@City", SqlDbType.NVarChar, 15);

    adapter.SelectCommand = command;

    // Create the InsertCommand.
    command = new SqlCommand(
        "INSERT INTO Customers (CustomerID, CompanyName) " +
        "VALUES (@CustomerID, @CompanyName)", connection);

    // Add the parameters for the InsertCommand.
    command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
    command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");

    adapter.InsertCommand = command;

    // Create the UpdateCommand.
    command = new SqlCommand(
        "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
        "WHERE CustomerID = @oldCustomerID", connection);

    // Add the parameters for the UpdateCommand.
    command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
    command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
    SqlParameter parameter = command.Parameters.Add(
        "@oldCustomerID", SqlDbType.NChar, 5, "CustomerID");
    parameter.SourceVersion = DataRowVersion.Original;

    adapter.UpdateCommand = command;

    // Create the DeleteCommand.
    command = new SqlCommand(
        "DELETE FROM Customers WHERE CustomerID = @CustomerID", connection);

    // Add the parameters for the DeleteCommand.
    parameter = command.Parameters.Add(
        "@CustomerID", SqlDbType.NChar, 5, "CustomerID");
    parameter.SourceVersion = DataRowVersion.Original;

    adapter.DeleteCommand = command;

    return adapter;
}


--------------------编程问答-------------------- 今天试了下,用两个adapter成功插入了
自己理解下原因:
 提交update的时候,dataset的数据应该是和最初的dataset数据不同吧?

            SqlConnection conn = new SqlConnection("Data Source=HARRY;Initial Catalog=MyLibrary;Integrated Security=True");
            DataSet dataset = new DataSet();
            SqlDataAdapter dtAdapt = new SqlDataAdapter("SELECT BookshelfNum, BookshelfType, LibraryName FROM BookShelfs", conn);
              dtAdapt.Fill(dataset, "test");

            SqlDataAdapter adapter = new SqlDataAdapter("insert into BookShelfs values('adotest1','testName','MyLib')", conn);
            adapter.Fill(dataset, "test");
            adapter.Update(dataset, "test");
--------------------编程问答-------------------- 学习 --------------------编程问答-------------------- INSERT COMMAND 不用自己写

用dtAdapt.GetInsertCommand()方法

然后用dtAdapt.Update()方法。 --------------------编程问答-------------------- --------------------编程问答-------------------- dataset里面的数据你修改了吗? --------------------编程问答-------------------- --------------------编程问答-------------------- 最好用@xxx的参数形式,这样可以在一定程度上防治SQL注入,这两篇文章可能会对你有所帮助http://blog.csdn.net/BossDarcy/archive/2010/11/15/6010095.aspx 
http://blog.csdn.net/BossDarcy/archive/2010/11/19/6021458.aspx
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,