Tag: stored procedures

C#ExecuteQuery null值

我有一些代码: using (OAZISDBDataContext ctx = new OAZISDBDataContext()) { IEnumerable details = ctx.ExecuteQuery(“exec [dbo].[zna_contact] {0}, {1}”, “test”, “19601023”, } 但是,我还希望能够将空值传递给存储过程,因此它不会使用它们。 现在使用字符串这很容易,我可以传递String.Empty,它会工作。 但是,如果我想传递空日期,这是一个问题。 我显然试过了: using (OAZISDBDataContext ctx = new OAZISDBDataContext()) { IEnumerable details = ctx.ExecuteQuery(“exec [dbo].[zna_contact] {0}, {1}”, “test”, null, } 但这不起作用,给出错误: System.Exception:queryparameter不能是System.Object类型。 经过一些阅读后,我发现ExecuteCommand不支持null参数,而规范断言它应该。 有没有人遇到过这个问题并找到了解决方法? 谢谢你们

Stored Proc返回一个Cursor,如何在C#中使用OLEDB来处理它

我正在使用OLEDB驱动程序调用Oracle DB中的存储过程。 存储过程将光标作为输出返回。 我可以使用Oracle数据源(System.Data.Oracle.OracleCommand)调用此存储过程,但是我不知道如何使用OLEDB数据源调用此SP。 有关如何指定SP的任何帮助都返回光标,因为使用OLEDB的输出将非常受欢迎。 private static OracleCommand CreateOraStoredProcCmd() { string storedProcName = “pkg_query.prc_get_my_trades”; OracleCommand cmd = new OracleCommand(storedProcName); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue(“book_list”, “Jan, Feb”); cmd.Parameters.AddWithValue(“maturity_date_start”, DateTime.Now.ToString(“dd-MMM-yyyy”)); cmd.Parameters.AddWithValue(“maturity_date_end”, DateTime.Now.ToString(“dd-MMM-yyyy”)); cmd.Parameters.AddWithValue(“ccy_list”, “GBP,USD”); cmd.Parameters.Add(“trades”, OracleType.Cursor).Direction = ParameterDirection.Output; return cmd; } 我不知道如何指定参数“trades”是OledbCommand对象上的输出光标。 提前致谢!

将COMPLEX存储过程转换为C#和ADO.Net

这不是SP是好还是坏的问题。 或者在C#中编写SQL语句是好还是坏。 我们很快就开始研究一个典型的库存/计费管理系统的新项目。 这将使用.Net和C#作为语言开发。 数据库尚未最终确定。 在此应用程序中不允许使用存储过程,它将具有中到复杂的数据库操作。 因此,我可以轻松地使用SP编写的逻辑,现在我将不得不使用C#和ADO.Net编写。 现在采取一个非常假的使用案例,客户选择了5项并准备好在柜台生成账单…. 这通常会有以下数据库操作: 检查INVENTORY表以查看是否所有5个订单项都可用(数量足够)。 如果任何项目不可用 – 从账单中删除该项目并更新BILL表 将更新INVENTORY表的数量字段,并将使用已售出的项目扣除数量字段。 警报/更新其他表是项目的阈值数量低于某一点。 现在看一下这个场景,这可以在SP中轻松完成。 这包含很多查询,IF条件,可能的循环等,看起来像SP的一个很好的竞争者。 我想从专家那里得到的是: 是否有在C#和ADO.Net中编写此类代码的最佳实践。 在C#中,我们通常可以使用ADO.Net重新创建相同的代码。 但这是唯一的方式还是正确的方式? 我看过很多人说存储过程很糟糕…… 但是在考虑像这样的复杂场景时……你不觉得存储过程在这种情况下更适合。

存储过程中的企业库缓存参数?

我正在尝试与同事一起标准化一些数据访问代码。 上述同事之一断言,EntLib数据访问块试图在存储的proc调用上缓存参数。 我看过reflection器,有一些证据表明它可以缓存它们。 但我不认为它会在以下情况下发生。 public Dictionary GetQueue(int maxItems) { var sq = new SqlDatabase(_connString.ConnectionString); var result = new Dictionary(); using (var cmd = (SqlCommand)sq.GetStoredProcCommand(“dbo.GetQueue”)) { sq.AddInParameter(cmd, “maxItems”, DbType.Int32, maxItems); var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); while (reader.Read()) { long id = reader.GetInt64(reader.GetOrdinal(“id”)); string fileName = reader.GetString(reader.GetOrdinal(“meta_data_filename”)); result.Add(id, fileName); } } return result; } 任何人都可以确认或否认这个吗? 我正在使用EntLib 4.1

.NET核心entity framework存储过程

我正在尝试将ASP.NET 4.5应用程序移植到.NET Core,我有一个我似乎无法弄清楚的真正问题。 我现有的应用程序执行存储过程,返回带有多个数据表的数据集。 entity framework可以自动将返回的字段映射到我的实体属性,但仅适用于数据集中的第一个数据表(自然)。 所以我只想弄清楚它是否可能以某种方式拦截模型构建过程并使用自定义代码来处理数据集并查看其他数据表来设置实体字段。 我知道我可以使用SqlConnection直接执行存储过程的常规方法,但我想知道entity framework是否有某种方法可以执行此操作。

在Dapper中执行带有参数的存储过程

我正在使用Dapper (感谢Sam ,很棒的项目。)带有DAL的微型ORM,由于某种原因,我无法使用输入参数执行存储过程。 在某种服务中,我有这样的事情: public void GetSomething(int somethingId) { IRepository repository = UnitOfWork.GetRepository(); var param = new DynamicParameters(); param.Add(“@somethingId”, dbType: DbType.Int32, value:somethingId, direction: ParameterDirection.Input); var result = repository.Exec(SomethingEnum.spMyStoredProcedure, param); … } 当存储过程的执行发生时,抛出SqlException声明我需要提供’somethingId’ 过程或函数’spMyStoredProcedure’需要参数’@somethingId’,这是未提供的。 我的DAL类似于Pencroff的这个github项目。 我在这里错过了什么吗? 更新:我实际上是通过SomethingEnum传递commandType: public class SomethingEnum : EnumBase { public static readonly SomethingEnum spMyStoredProcedure = new SomethingEnum(“spMyStoredProcedure”, “[dbo].[spMyStoredProcedure]”, CommandType.StoredProcedure); public SomethingEnum(string Name, […]

如何使用SqlConnection.GetSchema()获取列主键约束

我有一些ADO.NET代码来动态检测数据库模式,我需要的是如何使用SqlConnection上的GetSchema方法获取唯一列约束和主键约束。 这是我的代码: conn.Open(); SqlCommand mSqlCommand = new SqlCommand(“sp_pkeys”, conn); mSqlCommand.CommandType = CommandType.StoredProcedure; mSqlCommand.Parameters.Add( “@table_name”, SqlDbType.NVarChar).Value = tableName; SqlDataReader mReader = mSqlCommand.ExecuteReader( (CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly)); //ExecuteReader(); DataTable schema = mReader.GetSchemaTable(); mReader.Close(); conn.Close();

使用LINQ和Entity Framework获取存储过程输出参数

我创建了一个存储过程,它接受参数来创建用户。 如果用户已存在,则将输出参数设置为“用户已存在”,并且不执行任何操作。 现在我已将此函数(InsertNewUser)映射到我的entity framework,并调用它如下: context.InsertNewUser(email,name,passwordhash,salt,???) ??? 是我遇到麻烦的地方。 在存储过程中,此参数是OUTPUT参数。 我尝试声明一个字符串,然后传入“out declaredString”但这不正确。 我不确定我是以正确的方式去做,有什么想法吗? 这是存储过程: ALTER PROCEDURE dbo.InsertNewUser ( @eMail nvarchar(256), @firstName nvarchar(256), @lastName nvarchar(256), @passwordHash nvarchar(256), @salt nvarchar(256), @output nvarchar(256)OUTPUT ) 如 / *将用户保存到数据库。 * / 开始 – 首先检查用户是否不存在 IF EXISTS(从UserSet发送电子邮件到WHERE eMail = @eMail) – 返回该用户存在 SET @output =’用户存在’ 其他 INSERT INTO UserSet VALUES(@eMail,@ firstName,@ lastName,@ passwordHash,@ […]

如何在defaultprocedure中将默认值传递给日期参数 – Sqlserver 2008?

这是我的存储过程: ALTER proc [dbo].[allrecp] @peid int=0, @pename varchar(20)=”, @pdes varchar(20)=”, @pdoj date=’1111-1-1′, @sal money=0, @dept int=0, @loc int=0,@i int=0 as begin if(@i=1) begin insert into Employee values(@pename,@pdes,@pdoj,@sal,@dept,@loc) end if(@i=2) begin update Employee set ENAME=@pename,DESEGNATION=@pdes,DOJ=@pdoj,SALARY=@sal,DEPTID=@dept,LOCATIONID=@loc WHERE EMPID=@peid end if(@i=3) delete EMPLOYEE where EMPID=@peid end 我的c#代码是: private void btndelete_Click(object sender, EventArgs e) { parameteres(3); } private void […]

ASP.NET MVC4使用Entity Framework从存储过程返回输出

我一直试图从存储过程中获得一个简单的输出 ALTER PROCEDURE [dbo].[sp_getrandomnumber] @randoms int output AS begin set @randoms =12345 end 和我的mvc public ActionResult Index() { var qry = db.sp_getrandomnumber(ref randoms); …… return View(); } } 但是当我编译时,我在var qry部分得到错误,说下面的内容 方法’sp_getrandomnumber’没有重载需要1个参数 当前上下文中不存在“randoms”这个名称 我尝试过本教程http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx 非常感谢Hesh