是用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。 如何让参数按照自定义顺序传递
<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。 如何让参数按照自定义顺序传递
解决方案 »
- 关闭打开左边的框架,为什么第一遍单击没有用
- C# 调用共享打印机问题
- 在线求助:如何编译文件
- 功能强大的DevExpress控件组中gridControl控件数据显示的问题
- 一个access内容修改的问题,急~~~~~~~~~~~~~
- DataGrid控件的显示
- 有没有人知道怎样解决下面的问题啊!
- 新手,请指教,TKS!如果要在构造函数中添加代码,同样也可以添加在InitializeComponent()里吗?效果是否一样?
- 我想使用第三方的C++库,用在我的C#程序中的unsafe段,如何包含头文件?
- 能得到tables中的某一列的字段宽度吗?
- 遍历打开目录下所有*.txt文件,并分析文件内容是否出现输入关键字
- 遍历Checkbox并读取其值的问题
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();
没有办法,是Jet的毛病,搞清楚。
可以后台赋值,与顺序是无关的,
如设置为模板列,单向邦定,如果是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;
..................
}