存储过程- c# &DB2错误:一个意外的令牌" end - statement "在“get_pr
本文关键字:quot end statement 令牌 pr get 一个 错误 DB2 存储过程 意外 | 更新日期: 2023-09-27 18:01:20
当我尝试从c#代码调用DB2存储过程时,我得到以下错误消息:
ERROR [42601] [IBM][CLI Driver][DB2/NT64] SQL0104N在"get_profile_internet"后面发现了一个意外的令牌" end - statement "。期望的令牌可能包括:"JOIN "。SQLSTATE = 42601
我做错了什么?
下面是DB2—存储过程代码
create procedure db2admin.pr_get_profile_internet (
IN p_profile_internet_id INT
)
BEGIN
DELCARE c_profile_internet CURSOR WITH RETURN TO CLIENT FOR
SELECT *
FROM profile_internet
WHERE profile_internet_id = p_profile_internet_id;
OPEN c_profile_internet;
END;
我的c#代码
public CDataResult<DataSet> GetProfileInternet() {
string v_connection_string = General.GetDBConnection();
CDataResult<DataSet> v_result = new CDataResult<DataSet>();
OdbcConnection v_connection = new OdbcConnection(v_connection_string);
try {
// Open Connection
v_connection.Open();
OdbcCommand cmd = new OdbcCommand("db2admin.pr_get_profile_internet", v_connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("p_profile_internet_id", OdbcType.Int);
cmd.Parameters["p_profile_internet_id"].Value = this.ProfileInternetId;
OdbcDataAdapter da = new OdbcDataAdapter(cmd);
DataSet ds = new DataSet("GetProfileInternet");
da.Fill(ds);
if (ds != null && ds.Tables[0].Rows.Count > 0) {
v_result.ErrorOccured = false;
v_result.ErrorMessageEn = "";
} else {
v_result.ErrorOccured = true;
v_result.ErrorMessageEn = "Error! User code is not valid.";
}
} catch (Exception ex) {
v_result.ErrorOccured = true;
v_result.ErrorMessageEn = "DB error: CProfileInternet->GetProfileInternet()";
v_result.ErrorException = ex.Message + ''n' + ex.InnerException;
} finally {
if (v_connection != null) {
v_connection.Close();
}
}
return v_result;
}
这里是最新的c#代码版本:
public CDataResult<DataSet> GetProfileInternet()
{
string v_connection_string = General.GetDBConnection();
CDataResult<DataSet> v_result = new CDataResult<DataSet>();
OdbcConnection v_connection = new OdbcConnection(v_connection_string);
try
{
// Open Connection
v_connection.Open();
OdbcCommand cmd = new OdbcCommand("call db2admin.pr_get_profile_internet", v_connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("p_profile_internet_id", OdbcType.Int);
cmd.Parameters["p_profile_internet_id"].Direction = ParameterDirection.Input;
cmd.Parameters["p_profile_internet_id"].Value = this.ProfileInternetId;
OdbcDataAdapter da = new OdbcDataAdapter(cmd);
DataSet ds = new DataSet("GetProfileInternet");
da.Fill(ds);
if (ds != null && ds.Tables[0].Rows.Count > 0)
{
v_result.ErrorOccured = false;
v_result.ErrorMessageEn = "";
}
else
{
v_result.ErrorOccured = true;
v_result.ErrorMessageEn = "Error! User code is not valid.";
}
}
catch (Exception ex)
{
v_result.ErrorOccured = true;
v_result.ErrorMessageEn = "DB error: CProfileInternet->GetProfileInternet()";
v_result.ErrorException = ex.Message + ''n' + ex.InnerException;
}
finally
{
if (v_connection != null)
{
v_connection.Close();
}
}
return v_result;
}
下面是我的DB2存储过程代码:
create procedure db2admin.pr_get_profile_internet
(IN p_profile_internet_id int)开始
Declare c_profile_internet CURSOR WITH RETURN TO CLIENT FOR
Select *
From db2admin.profile_internet
Where profile_internet_id = p_profile_internet_id;
Open c_profile_internet;
结束;
这是我的表结构
create table profile_internet
(
profile_internet_id int not null,
code_client varchar(30) not null,
prenom varchar(100) not null,
nom varchar(100) not null,
adresse varchar(100) not null,
appartement varchar(100) null,
ville varchar(100) not null,
code_postal varchar(30) not null,
code_province varchar(10) not null,
telephone_domicile varchar(30) null,
telephone_mobile varchar(30) null,
telephone_bureau varchar(30) null,
extension_bureau varchar(10) null,
date_de_naissance date null,
langue varchar(1) not null,
courriel varchar(100) null,
profil_actif smallint not null,
date_creation timestamp not null,
creer_par varchar(30) not null,
date_modification timestamp not null,
modifier_par varchar(30) not null,
primary key (profile_internet_id)
)
;
CREATE UNIQUE INDEX idx_profile_internet_code_client ON profile_internet (code_client);
CREATE UNIQUE INDEX idx_profile_internet_courriel ON profile_internet (courriel);
我该怎么做才能避免得到以下错误信息:
ERROR [42884] [IBM][CLI Driver][DB2/NT64] SQL0440N未授权名为"DB2ADMIN "的例程。找到"PROCEDURE"类型的具有兼容参数的PR_GET_PROFILE_INTERNET"。SQLSTATE = 42884
看起来应该在调用存储过程时打开一个DataReader,以便它可以处理语句结束
OdbcDataReader Reader = cmd.ExecuteReader();
然后while (Reader.Read())
{
try
{
}
}
您必须使用'CALL'
动词指定完整的ODBC语法,而不仅仅是SP名称。
我想和大家分享一下未来的解决方案。
首先,我使用的是Visual Studio 2005,我在本地机器上安装了DB2 Express 10.1.2.2。我将引用添加到文件C:'Program Files'IBM'SQLLIB'BIN'netf20' . IBM.Data.DB2.dll中,但是没有工作。当它尝试打开连接时,它一直返回以下错误消息: error - no error information available
为了解决这个问题,我用Visual Studio 2010创建了相同的项目,并添加了对文件C:'Program Files'IBM'SQLLIB'BIN'netf40' IBM.Data.DB2.dll的引用。在项目的属性中,我将目标框架更改为:.Net Framework 4,并且我能够调用DB2存储过程
这是c#的工作代码:
using IBM.Data.DB2;
public DataSet GetProfileInternet()
{
string v_connection_string = "Database=myDatabase;Server=myServer:myPort;UID=myUserId;PWD=myPassword";
DB2Connection v_connection = new DB2Connection(v_connection_string);
try
{
// Open Connection
v_connection.Open();
DB2Command cmd = new DB2Command("pr_get_profile_internet", v_connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("p_profile_internet_id", DB2Type.Integer);
cmd.Parameters["p_profile_internet_id"].Direction = ParameterDirection.Input;
cmd.Parameters["p_profile_internet_id"].Value = 1;
DB2DataAdapter da = new DB2DataAdapter(cmd);
DataSet ds = new DataSet("GetProfileInternet");
da.Fill(ds);
return ds;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (v_connection != null)
{
v_connection.Close();
}
}
}