是用SqlDatasource控件连接access数据库,代码超级简单,完全就是IDE自己生成的代码
<asp:SqlDataSource ID="DSTest" runat="server" ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\money.mdb;Persist Security Info=True;Jet OLEDB:Database Password=521088"
            DeleteCommand="DELETE FROM [cost] WHERE [costID] = ?" InsertCommand="INSERT INTO [cost] ([costID], [日期], [支出项目], [支出金额], [styleID]) VALUES (?, ?, ?, ?, ?)"
            ProviderName="System.Data.OleDb" SelectCommand="SELECT [costID], [日期], [支出项目], [支出金额], [styleID] FROM [cost]"
            UpdateCommand="UPDATE [cost] SET [日期] = ?, [支出项目] = ?, [支出金额] = ? , styleID = ? WHERE [costID] = ?">
            <DeleteParameters>
                <asp:Parameter Name="costID" Type="Int32" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="日期" Type="DateTime" />
                <asp:Parameter Name="支出项目" Type="String" />
                <asp:Parameter Name="支出金额" Type="Decimal" />
                <asp:Parameter Name="styleID" Type="Int32" />
                <asp:Parameter Name="costID" Type="Int32" />
            </UpdateParameters>
            <InsertParameters>
                <asp:Parameter Name="costID" Type="Int32" />
                <asp:Parameter Name="日期" Type="DateTime" />
                <asp:Parameter Name="支出项目" Type="String" />
                <asp:Parameter Name="支出金额" Type="Decimal" />
                <asp:Parameter Name="styleID" Type="Int32" />
            </InsertParameters>
        </asp:SqlDataSource>在msdn上看到这段话:如果要连接到 OLE 数据库或 ODBC 数据源,可以对 SqlDataSource 控件进行配置,使其通过 System.Data.OleDb 或 System.Data.Odbc 提供程序分别使用数据源。System.Data.OleDb 和 System.Data.Odbc 提供程序只支持由“?”字符标识的定位参数,如以下示例所示:
SELECT * FROM Employees WHERE LastName = ? AND FirstName = ?
将 System.Data.OleDb 和 System.Data.Odbc 提供程序与参数化 SQL 语句结合使用时,参数占位符的指定顺序必须与相关参数集合中的参数顺序匹配。可以控制参数的顺序,方法是在执行相关数据操作的集合(如相关 UpdateCommand 的 UpdateParameters 集合)中显式指定这些参数。为通过数据绑定控件传递的值自动创建的参数显式创建参数集合时,显式创建的参数将会改写自动生成的所有参数。这样,可以确保参数按照所需的顺序进行传递。
我理解红色字体部分就是在<UpdateParameters>中声明参数顺序就可以控制updatecommand中的?代表的参数的顺序,因为我的需求上将表中的数据全部读出,但只更新一部分,比如上面的代码如果我只根据“costID”更新“日期”。但不管如何设置<UpdateParameters>中的参数的顺序,DBCommand中的参数顺序缺都是固定的,无法改变。
可以在数据源控件的Updating事件中设断点查看e.Command.Parameters数组和datasource.UpdateParameters,发现顺序并不相同。两个问题:
1。 为什么?
2。 如何让参数按照自定义顺序传递

解决方案 »

  1.   

    因为Access不支持参数符号,只能用“?”号...所以无法标识,只能按参数顺序识别...这里的顺序不是指标记顺序,是指添加到Parameters集合的顺序...你可能得用代码添加...
      

  2.   

    在Access中一定按照插入的列的顺序添加参数,OLE DB.NET Framework 数据提供程序使用标有问号 (?) 的定位参数,而不使用命名参数
     string sql = "insert into Tb_User(UserName,Password,)values(?,?)";
            OleDbConnection connection = new OleDbConnection();
            connection.ConnectionString = "";//此处设置链接字符串
            //注意下面参数的顺序
             OleDbCommand command = new OleDbCommand(sql, connection);
            command.Parameters.Add("?", OleDbType.LongVarWChar, 60).Value = userName;
            command.Parameters.Add("?", OleDbType.LongVarWChar, 60).Value = password;
            connection.Open();
            int rowsAffected = command.ExecuteNonQuery();
            connection.Close();
            command.Dispose();
      

  3.   

    那<UpdateParameters>标记还有什么用呢?
      

  4.   

    另外如何添加,给个思路 , 我只想在datasource和gridview控件的事件中添加,否则就要额外再添加类似按钮的控件了
      

  5.   


    没有办法,是Jet的毛病,搞清楚。
      

  6.   

    Jet最近10几年来就没有更新过。奇怪,如果是培训学校的学生我能理解,他们被那些教师的某些知识骗了。如果是正规学校老师,不知道sql server compact或者许多最近10年的嵌入式开源数据库,只知道jet就感觉是误人子弟了。
      

  7.   

    刚刚实验了一下,将<UpdateParameters>中的参数删除几个后,e.Command.Parameters数组中的参数相应减少
      

  8.   

    顺序应该是无关紧要的!!
    可以后台赋值,与顺序是无关的,
    如设置为模板列,单向邦定,如果是GridView,
    可以在GridView1_RowUpdating事件中进行与顺序无关的赋值:
        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            SqlDataSource1.UpdateParameters["支出金额"].DefaultValue = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("TextBox3")).Text;
            SqlDataSource1.UpdateParameters["支出项目"].DefaultValue = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("TextBox2")).Text;
            ..................
        }