using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;public partial class Insert : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string strCon = "Data Source=localhost;Initial Catalog=pubs;Integrated Security=True;User ID =sa;Password =sa";
        SqlConnection myConnection = new SqlConnection(strCon);
        //打开数据库连接
        myConnection.Open();        SqlCommand myCommand = new SqlCommand("select * from authors", myConnection);
        //设置InsertCommand
        SqlCommand sqlInsertCommand1 = new SqlCommand();
        sqlInsertCommand1.CommandText = @"INSERT INTO authors(au_id, au_lname, au_fname, phone, address, city, state, zip, contract) 
VALUES (@au_id, @au_lname, @au_fname, @phone, @address, @city, @state, @zip, @contract); 
SELECT au_id, au_lname, au_fname, phone, address, city, state, zip, contract FROM authors WHERE (au_id = @au_id)";///疑问1,为啥这里要写两句sql语句?@au_id等带@au_id的单词起啥作用?
        sqlInsertCommand1.Connection = myConnection;
        sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_id", System.Data.SqlDbType.VarChar, 11, "au_id"));///疑问2,这句话啥意思?这个句子语法上怎么讲啊?
        sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_lname", System.Data.SqlDbType.VarChar, 40, "au_lname"));
        sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_fname", System.Data.SqlDbType.VarChar, 20, "au_fname"));
        sqlInsertCommand1.Parameters.Add(new SqlParameter("@phone", System.Data.SqlDbType.VarChar, 12, "phone"));
        sqlInsertCommand1.Parameters.Add(new SqlParameter("@address", System.Data.SqlDbType.VarChar, 40, "address"));
        sqlInsertCommand1.Parameters.Add(new SqlParameter("@city", System.Data.SqlDbType.VarChar, 20, "city"));
        sqlInsertCommand1.Parameters.Add(new SqlParameter("@state", System.Data.SqlDbType.VarChar, 2, "state"));
        sqlInsertCommand1.Parameters.Add(new SqlParameter("@zip", System.Data.SqlDbType.VarChar, 5, "zip"));
        sqlInsertCommand1.Parameters.Add(new SqlParameter("@contract", System.Data.SqlDbType.Bit, 1, "contract"));        SqlDataAdapter Adapter = new SqlDataAdapter();
        Adapter.SelectCommand = myCommand;
        Adapter.InsertCommand = sqlInsertCommand1;        DataSet myDs = new DataSet();
        Adapter.Fill(myDs);        //获取DataTable
        DataTable myTable = myDs.Tables[0];
        //插入数据
        DataRow myRow = myTable.NewRow();
        //为新行赋值
        myRow["au_id"] = "322-22-2222";
        myRow["au_lname"] = "Li";
        myRow["au_fname"] = "Paul";
        myRow["phone"] = "12345678";
        myRow["city"] = "Chengdu";
        myRow["contract"] = 1;        //添加到Rows集合中
        myTable.Rows.Add(myRow);        //提交数据到数据库
        Adapter.Update(myDs);        //关闭数据库重新读取数据
        myConnection.Close();
        myConnection.Open();
        Adapter.Fill(myDs);
        //显示插入的数据
        Response.Write("<h3>插入数据</h3><hr>");
        Response.Write("<table border=1 cellspacing=0 cellpadding=2>");        //显示列名字
        Response.Write("<tr bgcolor=#DAB4B4>");
        foreach (DataColumn myColumn in myTable.Columns)
        {
            Response.Write("<td>" + myColumn.ColumnName + "</td>");
        }        Response.Write("</tr>");        //查找插入的行
        foreach (DataRow row in myTable.Rows)
        {
            if (row["au_id"].ToString() == "322-22-2222")
            {
                Response.Write("<tr>");
                foreach (DataColumn myColumn in myTable.Columns)
                {
                    Response.Write("<td>" + row[myColumn] + "</td>");
                }
                Response.Write("</tr>");
                break;
            }
        }
        Response.Write("</table>");        //关闭与数据库的连接
        myConnection.Close();
    }
    
}

解决方案 »

  1.   

    疑问1,为啥这里要写两句sql语句?@au_id等带@au_id的单词起啥作用?
    --------->
    这个意思是得到刚才插入的数据
    也就是说先把数据插入Table,然后返回Table的插入的行至于@au_id是防止SQL注入的一种写法,具体可以参考MSDN关于SqlParameter的解释
    疑问2,这句话啥意思?这个句子语法上怎么讲啊?
    -----》
    这个就是简单的应用SqlParameter也就是说在SQL文中@au_id是一个变量
    sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_id", System.Data.SqlDbType.VarChar, 11, "au_id"));
    在这里把这个变量进行赋值可以参考
    http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlparameter(VS.80).aspx
      

  2.   

    关于SQL注入
    比如说你有个SQL语句
    string sql="select * from users where username='"+username+"' and password='"+password+"'";
    如果用户输入的信息如下:
    Username:';drop table users—
    Password:你执行下看看会发生什么但是如果用了SqlParameter
    就不会发生这种情况
      

  3.   

    谢谢楼上的小强,msdn参考看不懂。sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_id", System.Data.SqlDbType.VarChar, 11, "au_id")); 
    ///小强的意思是用au_id的值代替@au_id的值么?那么au_id的值从哪里来呢?System.Data.SqlDbTyep.VarChar和11分别指啥呢?谢谢小强(btw,为啥用小强?看上去实在恶心。)谢谢。
      

  4.   

    SELECT * FROM authors WHERE au_id = @au_id
    比如说你这个SQL语句他的意思是从表authors 中取出记录,当au_id  = @au_id的时候这个写法就是@au_id是变量
    你可以传任意的值
    sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_id", System.Data.SqlDbType.VarChar, 11, "au_id")); 
    这句话就是给这个变量传值意思是"@au_id"这个变量是System.Data.SqlDbType.VarChar类型,长度是11,值为"au_id"这样你的SQL文就变成了
    SELECT * FROM authors WHERE au_id = 'au_id'不知道解释清楚没有,呵呵btw:俺上大学在学校外面租房子,满屋子的小强,跟小强很有感情的说~~
      

  5.   

    Sorry,错了
    sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_id", System.Data.SqlDbType.VarChar, 11, "au_id")); 
    这个意思是
    "@au_id"这个变量是System.Data.SqlDbType.VarChar类型,长度是11,对应的数据库字段为"au_id" 
      

  6.   

    具体的值是你Adapter.Update(myDs);
    的时候根据Table里面的值传递进去的
      

  7.   

    有点晕。sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_id", System.Data.SqlDbType.VarChar, 11, "au_id")); 
    可以改成
    sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_id", System.Data.SqlDbType.VarChar, 11, "au_id11")); 么?
    然后在改成myRow["au_id11"] = "322-22-2222";///这样给au_id11赋值322-22-2222,然后@au_id得到au_id11的值,最后把这个值替代sqlInsertCommand1.CommandText = @"INSERT INTO authors(au_id, au_lname, au_fname, phone, address, city, state, zip, contract) 
    VALUES (@au_id, @au_lname, @au_fname, @phone, @address, @city, @state, @zip, @contract); 
    SELECT au_id, au_lname, au_fname, phone, address, city, state, zip, contract FROM authors WHERE (au_id = @au_id)";///替代这句话里面的@au_id对么?
      

  8.   

    sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_id", System.Data.SqlDbType.VarChar, 11, "au_id")); 
    可以改成 
    sqlInsertCommand1.Parameters.Add(new SqlParameter("@au_id", System.Data.SqlDbType.VarChar, 11, "au_id11")); 么? 不可以
    因为最后一个参数代表的是数据库中字段名称myRow["au_id11"] 你这个里面au_id11是不存在的~~~~
      

  9.   

    哦。
    那么,
     myRow["au_id"] = "322-22-2222";///这个au_id的值是322-22-2222,是表示
     sqlInsertCommand1.CommandText = @"INSERT INTO authors(au_id, au_lname, au_fname, phone, address, city, state, zip, contract) 
    VALUES (@au_id, @au_lname, @au_fname, @phone, @address, @city, @state, @zip, @contract); 
    SELECT au_id, au_lname, au_fname, phone, address, city, state, zip, contract FROM authors WHERE (au_id = @au_id)";///代替这个里面红色的部分的值么?
    ///
    如果 myRow["au_id"] 表示的值是代替 @au_id,那么myRow["@au_id"]的值是代替 @@au_id?
    如果不是这样,那么通过什么来绑定au_id和@au_id之间的值传递呢?有没有个流程么?///真不好意思。。偶晕头转向了。
      

  10.   

    代替这个里面红色的部分的值么? 
    是的myRow["au_id"] 表示的值是代替 @au_id,
    这是对的myRow["@au_id"]的值是代替 @@au_id? 
    这不对myRow["au_id"] 中的au_id表示的是你sql中select出来的au_id列在SQL文中的@au_id,表示这个地方是一个参数
    然后在SqlParameter的地方给这个参数赋值
    具体在执行SQL文的时候,是如何把SqlParameter中的值代替掉SQL文中的@au_id参数,那是MS帮我们做掉的事情
      

  11.   

    做Adapter.Update操作,需要有相对应的SqlCommand~~可以用SqlCommandBuilder进行自动的生成insert等语句,不过的SelectCommand是一定要有的。。要不然不知道生成什么~~为了生成 INSERT、UPDATE 或 DELETE 语句,SqlCommandBuilder 会自动使用 SelectCommand 属性来检索所需的元数据集直接使用SqlCommandBuilder貌似效率会低一些
      

  12.   

    MSDN上的例子public static DataSet SelectSqlRows(string connectionString,
        string queryString, string tableName)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = new SqlCommand(queryString, connection);
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);        connection.Open();        DataSet dataSet = new DataSet();
            adapter.Fill(dataSet, tableName);        //code to modify data in DataSet here        //Without the SqlCommandBuilder this line would fail
            adapter.Update(dataSet, tableName);        return dataSet;
        }
    }
      

  13.   

    那么哪一句话会调用Adapter.InsertCommand 里面的sql代码呢?
    另外,很苦恼的是,这段从书上抄下来的代码居然不能运行...报错:
    Adapter.Fill(myDs); //错误 1 与“System.Data.Common.DbDataAdapter.Fill(System.Data.DataTable)”最匹配的重载方法具有一些无效参数
    错误 2 参数“1”: 无法从“DataSet”转换为“System.Data.DataTable” DataTable myTable = myDs.Tables[0];//错误 3 “DataSet”并不包含“Tables”的定义 ....很多.
      

  14.   

    那么哪一句话会调用Adapter.InsertCommand 里面的sql代码呢? Adapter.Update(myDs);
    这句我在05下编译没有问题
      

  15.   

    甭说书上,MSDN上不是照样有错的么不过你这段代码我可以编译过去
    呵呵
      

  16.   

    如果加上下面的句子
    SqlCommand sqlUpdateCommand1 = new SqlCommand();
            sqlUpdateCommand1.CommandText = @"Update authors set city = @city WHERE au_id = @Original_au_id";///        sqlUpdateCommand1.Connection = myConnection;
            sqlUpdateCommand1.Parameters.Add(new SqlParameter("@city", System.Data.SqlDbType.VarChar, 20, "city"));///    
        sqlUpdateCommand1.Parameters.Add(new SqlParameter("@Original_au_id", System.Data.SqlDbType.VarChar, 11, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "au_id", System.Data.DataRowVersion.Original, null));///这句话那么长,那么多个参数是啥意思?可以精简成sqlUpdateCommand1.Parameters.Add(new SqlParameter("@Original_au_id",
    System.Data.SqlDbType.VarChar, 11,"au_id");么?第三个问题,
    如果
    加上 
    Adapter.UpdateComand=sqlUpdateComman1;那么往下
    执行一段修改代码
    在执行
    Adapter.Update(myDs); ///是执行Adapter.InsertCommand  呢,还是执行Adapter.UpdateComand呢?
    谢谢.