如何通过TableAdapter来调用自己写的存储过程,并且给存储过程传递参数?

neucaibai 2012-03-06 02:35:04
比如自己在MYSQL中写了一个这样的存储过程:

DELIMITER $$

DROP PROCEDURE IF EXISTS `perf`.`CreateFactory` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `CreateFactory`(type INTEGER)
BEGIN
CASE type
WHEN 0 THEN
--some operations
WHEN 1 THEN
--some operations
--other WHEN
ELSE
--some operations
END CASE;
END $$

DELIMITER ;


现在我想在C#工程中,通过TableAdapter来调用该存储过程,并在调用的时候希望能传入参数来为type赋值。
我按照MSDN的文档http://msdn.microsoft.com/zh-cn/library/ms171921(v=vs.90).aspx中的做法:
右击所需的 TableAdapter,然后使用快捷菜单添加查询。

1“TableAdapter 查询配置向导”将打开。

2选择“使用现有存储过程”,然后单击“下一步”。

3从下拉列表中选择一个存储过程,然后单击“下一步”。

4选中“没有值”返回的选项,然后单击“下一步”。

5为该查询提供名称。

6单击“下一步”或“完成”完成该向导;该查询即被添加到 TableAdapter。

虽然生成了一个成员函数CreateFactory,但是却是无法传参的CreateFactory()的形式。请问有什么方法可以生成类似CreateFactory(int type)类型的方法来调用存储过程?还是只能通过最原始的编辑sqlcommand的方式?

ps:后来通过给这个TableAdapter添加UPDATE类型的Query,在这个query中直接写这样的SQL语句“CALL CreateFactory(1)”实现了从函数调用传入参数的存储过程,但这个函数种只能对应一个调用,复用性太差。~~
...全文
138 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
neucaibai 2012-03-07
  • 打赏
  • 举报
回复
非常感谢!成功了,确实和stonespace说的一样,把参数名改成和存储过程的参数名一样就好用了。
用微软的.net总觉得太透明了~~有时候除了调用、拖拉对来龙去脉很是模糊~~不知道学习.net有什么方法吗,能让人理解他整个框架和内部实现的机制,有什么书能推荐的吗??
[Quote=引用 6 楼 stonespace 的回复:]

另外参数名最好匹配,在vs里应该可以指定参数的名称,把CounterID的名字指定为type,
[/Quote]
stonespace 2012-03-06
  • 打赏
  • 举报
回复
另外参数名最好匹配,在vs里应该可以指定参数的名称,把CounterID的名字指定为type,
stonespace 2012-03-06
  • 打赏
  • 举报
回复
command.Parameters[0].Value = ((int)(CounterID));
这句话,它把参数ConterID传给Command了,Command应该可以正确的把这个参数传给存储过程,
neucaibai 2012-03-06
  • 打赏
  • 举报
回复
请问,那么这个参数作用是干什么的呢?貌似和存储过程中的参数看不出联系来。而且貌似都无法调试~
这是添加之后VS2008生成的代码:


public virtual int CreateFactory(int CounterID) {
global::MySql.Data.MySqlClient.MySqlCommand command = this.CommandCollection[1];
command.Parameters[0].Value = ((int)(CounterID));
global::System.Data.ConnectionState previousConnectionState = command.Connection.State;
if (((command.Connection.State & global::System.Data.ConnectionState.Open)
!= global::System.Data.ConnectionState.Open)) {
command.Connection.Open();
}
int returnValue;
try {
returnValue = command.ExecuteNonQuery();
}
finally {
if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
command.Connection.Close();
}
}
return returnValue;
}


[Quote=引用 1 楼 stonespace 的回复:]

你可以右键点TableAdapter方框里的CreateFactory,在快结菜单中选择“属性”,然后在属性编辑窗口中双击Paramter项,就会弹出一个编辑参数的对话框,然后选择增加参数,对应选择mysql类型和c#类型,就可以了,
[/Quote]
neucaibai 2012-03-06
  • 打赏
  • 举报
回复
请问,那么这个参数作用是干什么的呢?貌似和存储过程中的参数看不出联系来。而且貌似都无法调试~
这是添加之后VS2008生成的代码:

public virtual int CreateFactory(int CounterID) {
global::MySql.Data.MySqlClient.MySqlCommand command = this.CommandCollection[1];
command.Parameters[0].Value = ((int)(CounterID));
global::System.Data.ConnectionState previousConnectionState = command.Connection.State;
if (((command.Connection.State & global::System.Data.ConnectionState.Open)
!= global::System.Data.ConnectionState.Open)) {
command.Connection.Open();
}
int returnValue;
try {
returnValue = command.ExecuteNonQuery();
}
finally {
if ((previousConnectionState == global::System.Data.ConnectionState.Closed)) {
command.Connection.Close();
}
}
return returnValue;
}

[Quote=引用楼主 neucaibai 的回复:]
比如自己在MYSQL中写了一个这样的存储过程:
SQL code

DELIMITER $$

DROP PROCEDURE IF EXISTS `perf`.`CreateFactory` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `CreateFactory`(type INTEGER)
BEGIN
CASE type
WHE……
[/Quote]
stonespace 2012-03-06
  • 打赏
  • 举报
回复
如果是sql server的存储过程,vs可以自动识别出参数,mysql可能支持不完善,以后版本应该可以支持参数,
stonespace 2012-03-06
  • 打赏
  • 举报
回复
你可以右键点TableAdapter方框里的CreateFactory,在快结菜单中选择“属性”,然后在属性编辑窗口中双击Paramter项,就会弹出一个编辑参数的对话框,然后选择增加参数,对应选择mysql类型和c#类型,就可以了,

110,533

社区成员

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

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

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