Имеем:
хранимую процедуру INSERTDATA с одним входным параметром (STR10) и одним выходным (ID)
public class Data
{
public int? ID;
public string str10;
public Data(string str) { this.str = str; }
}
Data data = new Data("test");
using(DbManager db = new DbManager())
{
db.SetSpCommand("INSERTDATA", db.CreateParameters(data)).ExecuteNonQuery("ID", data);
}
это приводит к 'Parameter mismatch for procedure INSERTDATA'
Происходит это потому, что db.CreateParameters(data) создаёт два входных параметра,
затем SetSpCommand вызывает CreateSpParameters(), которая по хранимке с помощью GetSpParameters создаёт один входной и один выходной параметр
и затем (строка 850) при несовпадении IDbDataParameter.Direction
if (param.Direction != p.Direction)
{
System.Diagnostics.Debug.WriteLine(string.Format(
"Stored Procedure '{0}'. Parameter '{1}' has different direction '{2}'. Should be '{3}'.",
spName, name, param.Direction, p.Direction), typeof(DbManager).Namespace);
param.Direction = p.Direction;
}
а почему не p.Direction = param.Direction; ?
Здравствуйте, ylab, Вы писали:
Y>using(DbManager db = new DbManager())
Y>{
Y> db.SetSpCommand("INSERTDATA", db.CreateParameters(data)).ExecuteNonQuery("ID", data);
Y>}
Y>
Попробуйте
using(DbManager db = new DbManager())
{
db.SetSpCommand("INSERTDATA", db.CreateParameters(data, new string[]{"ID"})).ExecuteNonQuery(null, data);
}
Y>Y>if (param.Direction != p.Direction)
Y>{
Y> param.Direction = p.Direction;
Y>}
Y>
Y>а почему не p.Direction = param.Direction; ?
Потому что SqlCommandBuilder.DeriveParameters не знает про выходные параметры. Только про входно-выходные. Вот эта строка этот момент и исправляет.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Здравствуйте, Блудов Павел, Вы писали:
БП>Попробуйте
БП>using(DbManager db = new DbManager())
{
db.SetSpCommand("INSERTDATA", db.CreateParameters(data, new string[]{"ID"})).ExecuteNonQuery(null, data);
}
Так и сделал, просто не хотелось делать лишних телодвижений.
Y>>а почему не p.Direction = param.Direction; ?
БП>Потому что SqlCommandBuilder.DeriveParameters не знает про выходные параметры. Только про входно-выходные. Вот эта строка этот момент и исправляет.
У меня FbCommandBuilder.DeriveParameters (Firebird NetProvider2) направление параметров выдаёт правильно ID — output, STR10 — input
CREATE PROCEDURE INSERTDATA (STR10 varchar(10))
returns (ID integer)
as
begin
ID = GEN_ID(GEN_DATA_ID,1);
insert into DATA(ID, STR10) values(:ID, :STR10);
suspend;
end