Linq to sql 将参数传递到LinqToSql存储过程时出错 public IEnumerable ExecuteStoreProcedure(params对象[]参数) { 类型genericType=typeof(T); string commandthing=genericType.Name.Replace(“结果”,“结果”); //_db是我的Linq到Sql数据库 return _db.ExecuteQuery(commandthing,parameters).AsEnumerable(); }

Linq to sql 将参数传递到LinqToSql存储过程时出错 public IEnumerable ExecuteStoreProcedure(params对象[]参数) { 类型genericType=typeof(T); string commandthing=genericType.Name.Replace(“结果”,“结果”); //_db是我的Linq到Sql数据库 return _db.ExecuteQuery(commandthing,parameters).AsEnumerable(); },linq-to-sql,Linq To Sql,该存储过程名为GetOrder,并有一个orderid的int参数。我这样称呼上面的人: public IEnumerable<T> ExecuteStoredProcedure<T>(params object[] parameters) { Type genericType = typeof(T); string commandthing = genericType.Name.Replace("Resu

该存储过程名为GetOrder,并有一个orderid的int参数。我这样称呼上面的人:

public IEnumerable<T> ExecuteStoredProcedure<T>(params object[] parameters)
        {
            Type genericType = typeof(T);

            string commandthing = genericType.Name.Replace("Result", "");
            //_db is my Linq To Sql database
            return _db.ExecuteQuery<T>(commandthing, parameters).AsEnumerable();
        }
SqlParameter parm1=newsqlparameter(“@orderid”,SqlDbType.Int);
parm1.值=123;
var结果=
_ExecuteStoredProcedure(parm1).Single();
我收到以下错误:查询参数的类型不能为“System.Data.SqlClient.SqlParameter”

想法?还是我错过了一些明显的东西

更新:我正在尽可能地使其通用化……我目前的想法是,我必须做一些字符串技巧来创建ExecuteQuery文本和参数

更新:在我的会话界面和该界面的Linq到Sql实现下面发布……希望这能澄清我试图做什么

SqlParameter parm1 = new SqlParameter("@orderid", SqlDbType.Int);
                parm1.Value = 123;
 var results =
                    _session.ExecuteStoredProcedure<GetOrderResult>(parm1).Single();
公共接口会话:IDisposable
{
无效提交更改();
void Delete(表达式),其中T:class;
作废删除(T项),其中T:类别;
void DeleteAll(),其中T:class;
T单(表达式),其中T:class;
IQueryable All(),其中T:class;
无效添加(T项),其中T:类别;
void Add(IEnumerable items),其中T:class;
作废更新(T项),其中T:类别;
IEnumerable ExecuteStoreProcedure(params对象[]参数);
}
公共类LinqToSqlSession:ISession
{
公共只读数据库;
公共LinqToSqlSession()
{
_db=new db(ConfigurationManager.ConnectionString[Environment.MachineName].ConnectionString);
}
公共无效佣金()
{
_db.SubmitChanges();
}
/// 
///获取类型T提供的表并返回以进行查询
/// 
私有表GetTable(),其中T:class
{
返回_db.GetTable();
}
公共void Delete(表达式),其中T:class
{
var query=All()。其中(表达式);
GetTable().DeleteAllOnSubmit(查询);
}
公共作废删除(T项),其中T:class
{
GetTable().DeleteOnSubmit(项);
}
public void DeleteAll(),其中T:class
{
var query=All();
GetTable().DeleteAllOnSubmit(查询);
}
公共空间处置()
{
_db.Dispose();
}
公共T单(表达式),其中T:class
{
返回GetTable().SingleOrDefault(表达式);
}
公共IEnumerable ExecuteStoredProcedure(参数对象[]参数)
{
类型genericType=typeof(T);
string commandstring=genericType.Name.Replace(“结果”,“结果”);
//_db是我的Linq到Sql数据库
返回_db.ExecuteQuery(commandstring,parameters).AsEnumerable();
}
public IQueryable All(),其中T:class
{
返回GetTable().AsQueryable();
}
公共无效添加(T项),其中T:class
{
GetTable().InsertOnSubmit(项);
}
公共void Add(IEnumerable items),其中T:class
{
GetTable().InsertAllOnSubmit(项);
}
公共无效更新(T项),其中T:class
{
//这里什么都不需要
}
}

这不是使用Linq到SQL连接存储过程的方式。您应该扩展
DataContext
并改用
ExecuteMethodCall

摘自:


(我要先发制人地指出,这不是SQL注入向量,因为Linq to SQL将大括号转换为参数化查询。)

了解如何在Linq to SQL中调用存储过程


我相信有更好的方法可以做到这一点……但这一方法目前正在发挥作用:

var results = context.ExecuteQuery<MyResult>("EXEC usp_MyProc {0}, {1}",
    custID, custName);
public IEnumerable ExecuteStoreProcedure(params对象[]参数)
{
类型genericType=typeof(T);
StringBuilder sb=新的StringBuilder();
某人附加(“执行官”);
sb.Append(genericType.Name.Replace(“Result”,“”));
对于(int i=0;i

这有点脆弱,因为您的参数必须按正确的顺序设置,这可能会冒犯某些人……但它确实实现了目标。

您可以使用以下方法:

新建SqlParameter{ParameterName=“UserID”,Value=txtuserid.Text}

System.Data.SqlClient中的等效项为:

SqlParameter[]param=新的SqlParameter[2];
param[0]=新的SqlParameter(“@UserID”,txtserid)

也有同样的问题。以下方法对我有效

    public IEnumerable<T> ExecuteStoredProcedure<T>(params object[] parameters)
    {
        Type genericType = typeof(T);

        StringBuilder sb=new StringBuilder();
        sb.Append("EXEC ");
        sb.Append(genericType.Name.Replace("Result", " " ));
        for (int i = 0; i < parameters.Count(); i++)
        {
            sb.Append("{" + i.ToString() + "} ");
        }
        string commandstring = sb.ToString();

        return _db.ExecuteQuery<T>(commandstring, parameters);
    }
在my linqtosql GenericLinqRepository中的实现

public interface IBusinessEntityRepository
{
    .......
    object CallStoredProcedure(string storedProcedureName, object[] parameters);
}

如果我错了,请纠正我…这需要我为添加的每个存储过程创建一个新方法。我正试图使其通用化,以便消除噪音。@Webjedi:您可以将存储过程拖到Linq到SQL设计器界面上。在我看来,这种消除噪音的尝试只会损害可读性和设计一致性;您失去了
DataContext
提供的抽象,失去了参数的强类型,失去了在设计时验证DB模式/映射的能力。。。除了
DataContext
之外的每个类实际上都需要更多的代码来执行
    public IEnumerable<T> ExecuteStoredProcedure<T>(params object[] parameters)
    {
        Type genericType = typeof(T);

        StringBuilder sb=new StringBuilder();
        sb.Append("EXEC ");
        sb.Append(genericType.Name.Replace("Result", " " ));
        for (int i = 0; i < parameters.Count(); i++)
        {
            sb.Append("{" + i.ToString() + "} ");
        }
        string commandstring = sb.ToString();

        return _db.ExecuteQuery<T>(commandstring, parameters);
    }
public interface IBusinessEntityRepository
{
    .......
    object CallStoredProcedure(string storedProcedureName, object[] parameters);
}
public object CallStoredProcedure(string storedProcedureName, object[] parameters)
{
    DataContext dataContext = GetCurrentDataContext();
    MethodInfo method = dataContext.GetType().GetMethod(storedProcedureName);
    return method.Invoke(dataContext, parameters);
}