请教 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句也没错
以下是例子
--------------------编程问答-------------------- 今天试了下,用两个adapter成功插入了
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;
}
自己理解下原因:
提交update的时候,dataset的数据应该是和最初的dataset数据不同吧?
--------------------编程问答-------------------- 学习 --------------------编程问答-------------------- INSERT COMMAND 不用自己写
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");
用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#