C# 如何调用ACCESS中带参数的查询 敬请指教

royalxiabing 2010-01-11 03:30:48
如何在C#中调用带参数的ACCESS查询???紧急求救啊~~~

查询已经建好了:

PARAMETERS RepDay DateTime;
SELECT ... FROM ... WHERE ReportDay = RepDay;

请各位大侠不吝赐教~~~~~~

在线等
...全文
1254 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
巴朗鱼 2010-01-14
  • 打赏
  • 举报
回复
支持下,刚也遇到这种问题,不过我的问题简单,打算用DATATABLE去操作,干活~
royalxiabing 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 sdfkfkd 的回复:]
你的ACCESS是什么版本的
我的测试版本是ACCESS2000、VS2008
[/Quote]
我是ACCESS2003+VS2005 应该和这个关系不大,你试试我刚开始的方法在你的环境下可以正常执行不?刚才24楼说用我那几句话可以得到正确的结果 我纠结了~~~~~~~~~
你试试在你那能不能行得通这几句
......
string sql = "EXEC aaa '2010-01-03','2010-01-08'";
DataSet ds = new DataSet();
OleDbDataAdapter da = new OleDbDataAdapter(sql, olecon);
da.Fill(ds);
......
特别 2010-01-11
  • 打赏
  • 举报
回复
你的ACCESS是什么版本的
我的测试版本是ACCESS2000、VS2008
royalxiabing 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 wangminqi 的回复:]
我用你的方法可以得到结果!
问题没出在语句上

            OleDbConnection olecon = new OleDbConnection("......");

            try
            {
                olecon.Open();

                string sql = "EXEC aaa '2010-01-03','2010-01-08'";
                DataSet ds = new DataSet();
                OleDbDataAdapter da = new OleDbDataAdapter(sql, olecon);
                da.Fill(ds);

            }
            catch
            {
             
            }

得到3个记录ds.Tables[0].Rows.Count=3
找其他原因吧

http://www.mybuffet.cn
[/Quote]

不会吧,数据库里有数据,直接执行查询也能查出来数据,就是用"EXEC aaa '2010-01-03','2010-01-08'"; 得不到结果 真郁闷人啊~
我再找找看有没有别的原因
wangminqi 2010-01-11
  • 打赏
  • 举报
回复
我用你的方法可以得到结果!
问题没出在语句上

OleDbConnection olecon = new OleDbConnection("......");

try
{
olecon.Open();

string sql = "EXEC aaa '2010-01-03','2010-01-08'";
DataSet ds = new DataSet();
OleDbDataAdapter da = new OleDbDataAdapter(sql, olecon);
da.Fill(ds);

}
catch
{

}

得到3个记录ds.Tables[0].Rows.Count=3
找其他原因吧

http://www.mybuffet.cn
特别 2010-01-11
  • 打赏
  • 举报
回复
把你原来的换成
string sql = "EXEC bbb #2010-01-01#,#2010-01-10#";
试试

[Quote=引用 21 楼 royalxiabing 的回复:]
引用 20 楼 sdfkfkd 的回复:
下面是调用bbb的示例
AAA的你参照改一下就行,少传一个参数就可以了
C# code
            OleDbConnection conn=new OleDbConnection();
            conn.ConnectionString=@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\My Documents\db2.mdb;User Id=admin;Password=;";
            conn.Open();

            OleDbCommand cmd=new OleDbCommand();
            cmd.Connection= conn;
            cmd.CommandType= CommandType.StoredProcedure;
            cmd.CommandText="test";//这里是你查询的名称就行了,例如你的aaa或bbb//ACCESS参数要注意://并不是按照名称匹配的,而是按照传入的顺序匹配的            OleDbParameter para1=new OleDbParameter("@StartDay", OleDbType.Date );
            para1.Value=new DateTime(2009,1,2 );//假设日期为2010-01-01            cmd.Parameters.Add( para1 );

            OleDbParameter para2=new OleDbParameter("@EndDay", OleDbType.Date );
            para2.Value=new DateTime(2009,1,15 );//假设日期为2010-01-01            cmd.Parameters.Add( para2 );

            DataSet ds=new DataSet();
            OleDbDataAdapter da=new OleDbDataAdapter( cmd );
            da.Fill( ds );

            conn.Close();


试了一下,可以实现我要的效果.谢谢了
不过我稍微简化了一些
......
DataSet ds = new DataSet();
OleDbCommand command = new OleDbCommand(str_QueryName, Connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@StartDay", OleDbType.Date).Value = str_StartDay;
command.Parameters.AddWithValue("@EndDay", OleDbType.Date).Value = str_EndDay;
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
adapter.Fill(ds);
......
应该是和你给的代码一个效果的.

虽然解决了,但是你可以给我分析分析我刚开始的代码为什么会查询不出结果呢?????愁人~
[/Quote]
特别 2010-01-11
  • 打赏
  • 举报
回复
上面日期的注释是错误的,
应该为2009-1- 2和2009-1-15
royalxiabing 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sdfkfkd 的回复:]
下面是调用bbb的示例
AAA的你参照改一下就行,少传一个参数就可以了
C# code
OleDbConnection conn=new OleDbConnection();
conn.ConnectionString=@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\My Documents\db2.mdb;User Id=admin;Password=;";
conn.Open();

OleDbCommand cmd=new OleDbCommand();
cmd.Connection= conn;
cmd.CommandType= CommandType.StoredProcedure;
cmd.CommandText="test";//这里是你查询的名称就行了,例如你的aaa或bbb//ACCESS参数要注意://并不是按照名称匹配的,而是按照传入的顺序匹配的 OleDbParameter para1=new OleDbParameter("@StartDay", OleDbType.Date );
para1.Value=new DateTime(2009,1,2 );//假设日期为2010-01-01 cmd.Parameters.Add( para1 );

OleDbParameter para2=new OleDbParameter("@EndDay", OleDbType.Date );
para2.Value=new DateTime(2009,1,15 );//假设日期为2010-01-01 cmd.Parameters.Add( para2 );

DataSet ds=new DataSet();
OleDbDataAdapter da=new OleDbDataAdapter( cmd );
da.Fill( ds );

conn.Close();
[/Quote]

试了一下,可以实现我要的效果.谢谢了
不过我稍微简化了一些
......
DataSet ds = new DataSet();
OleDbCommand command = new OleDbCommand(str_QueryName, Connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@StartDay", OleDbType.Date).Value = str_StartDay;
command.Parameters.AddWithValue("@EndDay", OleDbType.Date).Value = str_EndDay;
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
adapter.Fill(ds);
......
应该是和你给的代码一个效果的.

虽然解决了,但是你可以给我分析分析我刚开始的代码为什么会查询不出结果呢?????愁人~
特别 2010-01-11
  • 打赏
  • 举报
回复
下面是调用bbb的示例
AAA的你参照改一下就行,少传一个参数就可以了

OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\My Documents\db2.mdb;User Id=admin;Password=;";
conn.Open();

OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "test"; //这里是你查询的名称就行了,例如你的aaa或bbb

//ACCESS参数要注意:
//并不是按照名称匹配的,而是按照传入的顺序匹配的
OleDbParameter para1 = new OleDbParameter( "@StartDay", OleDbType.Date );
para1.Value = new DateTime( 2009, 1, 2 ); //假设日期为2010-01-01
cmd.Parameters.Add( para1 );

OleDbParameter para2 = new OleDbParameter( "@EndDay", OleDbType.Date );
para2.Value = new DateTime( 2009, 1, 15 ); //假设日期为2010-01-01
cmd.Parameters.Add( para2 );

DataSet ds = new DataSet();
OleDbDataAdapter da = new OleDbDataAdapter( cmd );
da.Fill( ds );

conn.Close();
royalxiabing 2010-01-11
  • 打赏
  • 举报
回复
这个access的问题太困扰我了,看了你的回复,我再把问题详细的和你说一遍吧:
第一步,我在access数据里建了两个查询,查询aaa有一个参数,查询bbb有两个参数,这两个查询的代码分别如下:
aaa:
PARAMETERS RepDay DateTime;
SELECT ......FROM ...... WHERE ReportDay = RepDay;
(注:其中RepDay就是参数,执行这个查询的时候,只要给RepDay赋值,就能得到想要的结果集了)
bbb:
PARAMETERS StartDay DateTime, EndDay DateTime;
SELECT ......FROM......
WHERE ReportDay >= StartDay And ReportDay <= EndDay;
(注:其中StartDay,EndDay 就是参数,执行这个查询的时候,只要给RepDay赋值,就能得到想要的结果集了)

第二步,我在C#代码里(WINFORM程序)调用这两个查询得到我想要的结果集,调用第一个查询的代码如下:
......
string sql = "EXEC aaa '2010-01-01'";//查询语句
DataSet ds = new DataSet();//DataSet是表的集合
OleDbDataAdapter da = new OleDbDataAdapter(sql, Connection);//从数据库中查询
da.Fill(ds);//将数据填充到DataSet
......
(注:连接数据库的代码省略了,'2010-01-01'就是赋给RepDay参数的值)
这样能够执行成功,而且能得到正确的结果集.

但是,但是,但是,但是,但是,但是,但是,但是,但是
我用同样的用法去调用第二个查询,代码如下:
......
string sql = "EXEC bbb '2010-01-01','2010-01-10'";
DataSet ds = new DataSet();//DataSet是表的集合
OleDbDataAdapter da = new OleDbDataAdapter(sql, Connection);//从数据库中查询
da.Fill(ds);//将数据填充到DataSet
......
得到的ds总是空的,查不出应该有的数据
(注:数据库里有数据,就是查不出来)

大侠给俺分析分析救救急~~~~望请不吝赐教~万分感谢~
rainsnowclowd 2010-01-11
  • 打赏
  • 举报
回复
根据楼上各位高手的意见,你把你ACCESS中已经写好的SQL语句改一改,然其调用变为可能。

string strConnection = "Provider=Microsoft.Jet.OleDb.4.0;";
strConnection += @"Data Source=C:\BegASPNET\Northwind.mdb";

OleDbConnection objConnection = new OleDbConnection(strConnection);
OleDbCommand comm = new OleDbCommand();

string sql = "把你在ACCESS中定义好的SQL语句引出来赋值";

comm.CommandText = sql;
comm.Connection = objConnection;

comm.Parameters.Add();...//將你原SQL中的所有变量在这申明一下,就是加进去
comm.Parameters[1].Value = 123;//当你要出入的时候,再通过赋值,传入进去。就可以了

特别 2010-01-11
  • 打赏
  • 举报
回复
继续纠正

OleDbConnection oeConn = new OleDbConnection(strConnection);
oeConn.Open();
string sql ="你的视图名称";
OleDbCommand command=new OleDbCommand(sql,oeConn);
command.Parameters.AddWithValue("@RepDay", OleDbType.DateTime).Value = 你的时间参数值;
DataTable dt = new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
adapter.Fill(dt);
oeConn.Close();
adapter.Dispose();

[Quote=引用 16 楼 xray2005 的回复:]
纠正一下:

OleDbConnection oeConn = new OleDbConnection(strConnection);
            oeConn.Open();
            string sql ="SELECT * FROM table_Name WHERE ReportDay = ?";
            OleDbCommand command=new OleDbCommand(sql,oeConn);
            command.Parameters.AddWithValue("@RepDay", OleDbType.DateTime).Value = 你的时间参数值;
            DataTable dt = new DataTable();
            OleDbDataAdapter adapter = new OleDbDataAdapter(command);
            adapter.Fill(dt);
            oeConn.Close();
            adapter.Dispose();

[/Quote]
xray2005 2010-01-11
  • 打赏
  • 举报
回复
纠正一下:

OleDbConnection oeConn = new OleDbConnection(strConnection);
oeConn.Open();
string sql ="SELECT * FROM table_Name WHERE ReportDay = ?";
OleDbCommand command=new OleDbCommand(sql,oeConn);
command.Parameters.AddWithValue("@RepDay", OleDbType.DateTime).Value = 你的时间参数值;
DataTable dt = new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
adapter.Fill(dt);
oeConn.Close();
adapter.Dispose();
特别 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xray2005 的回复:]
OleDbConnection oeConn = new OleDbConnection(strConnection);
            oeConn.Open();
            string sql ="SELECT * FROM table_Name WHERE ReportDay = ?RepDay;
            OleDbCommand command=new OleDbCommand(sql,oeConn);
            command.Parameters.AddWithValue("RepDay", OleDbType.DateTime).Value = 你的时参数值;
            DataTable dt = new DataTable();
            OleDbDataAdapter adapter = new OleDbDataAdapter(command);
            adapter.Fill(dt);
            oeConn.Close();
            adapter.Dispose();

[/Quote]只有引用的内容不允许回复!
xray2005 2010-01-11
  • 打赏
  • 举报
回复
OleDbConnection oeConn = new OleDbConnection(strConnection);
oeConn.Open();
string sql ="SELECT * FROM table_Name WHERE ReportDay = ?RepDay;
OleDbCommand command=new OleDbCommand(sql,oeConn);
command.Parameters.AddWithValue("RepDay", OleDbType.DateTime).Value = 你的时参数值;
DataTable dt = new DataTable();
OleDbDataAdapter adapter = new OleDbDataAdapter(command);
adapter.Fill(dt);
oeConn.Close();
adapter.Dispose();
BeyondYV 2010-01-11
  • 打赏
  • 举报
回复
ACCESS没弄过,不明白,不过对于这种小型的、学习型的数据库,没必要搞存储过程等复杂的东西吧!?
notlikeGaoShou 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wusenet041 的回复:]
不明白你的意思哦
[/Quote]
帮顶
Hamsic 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 royalxiabing 的回复:]
引用 2 楼 wusenet041 的回复:
不明白你的意思哦


大侠们,刚才的问题你可能没理解我的意思,我的意思是:
我在ACCESS数据库里已经建立了一个带参数的查询(类似SqlServer的存储过程),然后我要在C#代码里进行调用,传入参数,得到查询后的结果集~就是想实现这个功能,可是代码不知道怎么写
请大侠们给指点指点呗~
[/Quote]

把你写的语句完整的贴出来
liushengmz 2010-01-11
  • 打赏
  • 举报
回复
不过楼主啊,我有一点不明白

“我在ACCESS数据库里已经建立了一个带参数的查询(类似SqlServer的存储过程),”

这个你是怎么实现的?我好像没去搞过
liushengmz 2010-01-11
  • 打赏
  • 举报
回复
你说的带参数的查询,只要在sql里面写上去就行了。

string sql = string.Format("select * from tblAAA where A = '{0}'", "Filter");

这条sql就是select * from tblAAA where A = 'Filter'

Filter就是你的参数了。很简单,自己看看吧
加载更多回复(8)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧