SetSpCommand
От: ylab  
Дата: 21.12.06 10:13
Оценка:
Имеем:

хранимую процедуру 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; ?
Re: SetSpCommand
От: Блудов Павел Россия  
Дата: 22.12.06 00:51
Оценка:
Здравствуйте, 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>>
Re[2]: SetSpCommand
От: Аноним  
Дата: 22.12.06 09:13
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Попробуйте

БП>
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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.