Tag: 存储过程

NHibernate只有存储过程

我想让NHibernate在调用ISession.Get时通过其键而不是使用动态SQL来获取实体时调用存储过程。 我们一直在使用NHibernate并允许它为查询和插入/更新/删除生成SQL,但现在可能必须将我们的应用程序部署到需要我们使用存储过程进行所有数据库访问的环境中。 我们可以在.hbm.xml映射文件中使用sql-insert,sql-update和sql-delete进行插入/更新/删除。 我们的hql和条件查询必须用存储过程调用替换。 但是,我还没有想出如何强制NHibernate使用自定义存储过程来获取按键的实体。 我仍然希望能够调用ISession.Get,如: using (ISession session = MySessionFactory.OpenSession()) { return session.Get(customerId); } 还有延迟加载对象,但我希望NHibernate调用我的“GetCustomerById”存储过程而不是生成动态SQL。 可以这样做吗? 考虑到我们必须支持的新环境,NHibernate可能不再合适。

SQL Server 2005中.NET存储过程的默认参数值/可选参数

SQL Server在.NET 2.0框架上用C#编写的存储过程,它具有SqlInt32参数。 我试图使参数可选。 这是一个最小的测试用例,只打印传递给它的整数: [Microsoft.SqlServer.Server.SqlProcedure] public static void TestProc( SqlInt32 TestInt ) { SqlPipe pipe; pipe = SqlContext.Pipe; if (TestInt.IsNull) { pipe.Send(“NULL value passed”); } else { pipe.Send(TestInt.ToString()); } } 这些命令按预期执行,并分别打印“1”和“NULL值传递”: exec dbo.TestProc @TestInt = 1 exec dbo.TestProc @TestInt = null 但是,我的目标是为@TestInt分配一个NULL的默认值,这将允许我执行这个命令: exec dbo.TestProc 我找不到一种方法来为.NET代码中的参数提供默认值。 从我可以通过Googling找到的,.NET 4.0将支持可选参数,因此可能是.NET 2.0没有。 并且(天真地)更改这样的参数声明会给出错误“不允许使用默认参数说明符”: SqlInt32 TestInt = SqlInt32.Null 我还尝试通过添加以下代码重载该方法: […]

如何将C#中的byte 作为字符串传递给SQL Server存储过程并转换为varbinary(MAX)

在这个项目中,有一个包装ADO.NET以进行常见数据访问的类,如ExecuteDataReader , ExecuteScalar等。 使用这些方法调用存储过程时,它允许您传递Dictionary参数(字符串键,字符串值),然后将其作为SqlParameter添加到SqlCommand对象中。 有一种情况我们必须在数据库中保存文档。 该文档是byte[] ,数据库中的相应列是varbinary(MAX) 。 我们已经四处寻找解决方案,但所有可用的都是使用SqlDbType.Varbinary示例,在这种情况下这不是一个选项。 我们最近的尝试是尝试将byte[]转换为二进制字符串,将其作为nvarchar(max)传递给存储过程,然后在将其保存到Document表时使用CONVERT(varbinary(max), @theFileBinaryString) ,但是,这会保存损坏的文件。 C# byte[] pDocumentBytes = …; string documentAsBinary = “0x” + BitConverter.ToString(pDocumentBytes).Replace(“-“, “”); SQL @DocumentContentAsBinary nvarchar(max) — This is “documentAsBinary” from C# above DECLARE @DocumentContentVarbinary varbinary(max); SET @DocumentContentVarbinary = CONVERT(varbinary(max), @DocumentContentAsBinary);

如何使用存储过程在SQL中插入多行?

我能够在单个语句中插入项目,但我想要做的是使用存储过程的另一个版本。 我怎么做。 这是我的代码: private void button1_Click(object sender, EventArgs e) { #region Get Values string[] array = {textBox1.Text+”:”+textBox5.Text,textBox2.Text+”:”+textBox6.Text,textBox3.Text+”:”+textBox7.Text,textBox4.Text+”:”+textBox8.Text}; string query = “”; string product = “”; int qty = 0; for (int i = 0; i < array.Length; i++ ) { product = array[i].ToString().Substring(0,array[i].ToString().IndexOf(':')); qty = int.Parse(array[i].ToString().Substring(array[i].ToString().IndexOf(':')+1)); if (string.IsNullOrEmpty(query)) { query = "Insert Into MySampleTable Values […]

从SQLDataReader读取结果时出现无效的强制转换exception

我的存储过程: @UserName nvarchar(64), AS BEGIN SELECT MPU.UserName, SUM(TS.Monday)as Monday //TS.Monday contains float value FROM dbo.MapTask MT JOIN dbo.MapPU MPU ON MPU.ID = MT.MPUID JOIN dbo.TimeSheet TS ON MT.TMSID = TS.ID WHERE MT.StartDate = @StartDate_int and MPU.UserName = @UserName GROUP BY MPU.UserName END 在我的C#代码中 SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { float monday = (float)reader[“Monday”]; // […]

在C#中使用存储过程

我正在使用C#编写数据库应用程序。 我需要在表格上显示数据,现在我已经完成了。 但我的业务逻辑硬编码到我的代码。 现在我想继续使用我的代码存储过程。 我需要做哪些修改。 一个简单的步骤列表就够了:) SqlConnection myConnection = new SqlConnection(“user id=dbblabla;” + “password=1234;server=localhost\\SQLEXPRESS;” + “Trusted_Connection=yes;” + “database=myDB; ” + “connection timeout=30”); try { myConnection.Open(); } catch (SqlException excep){ Console.WriteLine(excep.StackTrace); } String selectionQuery = “SELECT * FROM myTable”; SqlDataAdapter myAdapter = new SqlDataAdapter(selectionQuery,myConnection); DataSet ds = new DataSet(); myAdapter.Fill(ds,”AllInfo”); dataGridSearchOutput.DataSource = ds.Tables[“AllInfo”].DefaultView; 我从创建新的SQL命令开始,但我不确定我是否使用了正确的方法。 SqlCommand newCommand […]

如何在C#数据访问层中确定存储过程输出参数的大小属性

我已经使Castle Project的ActiveRecord实现无耻地建模数据访问层。 为了使它获得认可,它必须支持在我的组织中使用的大量存储过程库,这些库已被编写为使用可以想象的每个输入/输出结构,包括每种可能的数据类型的返回值和输出参数。 我的问题是开发代码,将输出参数添加到用于执行存储过程的Command对象的参数集合中。 现在我只是使用一个大的默认值,希望它足以捕获所有的情况,但这感觉粗制滥造。 如何提前知道输出参数的长度? 这是我的DAL类,使用属性来表示输出参数: [StoredProcedure(“usp_PostARTransaction”, OperationType.Insert)] public class ARTranPost : DataObjectBase { [StoredProcedureParameter(“sARTranID”,OperationType.Insert,ParameterDirection.Output)] public string ARTranID {get;set;} [StoredProcedureParameter(“sDueDate”, OperationType.Insert, ParameterDirection.Input)] public string DueDate { get; set; } [StoredProcedureParameter(“sPostDate”, OperationType.Insert, ParameterDirection.Input)] public string PostDate { get; set; } } 我是否需要使用SMO或其他库来从数据库中获取长度?

返回已处理记录号的SQL Server存储过程

我有一个Winforms应用程序,它执行一个存储过程,检查几行(大约500k)。 为了告知用户已经处理了多少行,我需要一个存储过程,每n行返回一个值。 例如,每处理1000行(大多数是INSERT )。 否则我只能在处理所有行时通知。 任何提示如何解决这个问题? 我认为使用触发器或某些计划任务可能很有用,但我无法弄清楚如何实现它。

ASP .NET MVC 3模型+存储过程

我是ASP MVC中的新手,我不知道如何根据我的db中的存储过程创建模型。 我已经有数据库与另一个应用程序一起工作,我的网页必须使用提到的数据库。 如果有人可以向我展示一些描述如何做到这一点的正确方法的代码,我将不胜感激。 (如果我不清楚:我需要创建使用我的数据库中的存储过程的ASP .NET模型,仅此而已) txh提前

回滚后返回ExecuteNonQuery的值

假设我们有一个存储过程,它确实像这样: BEGIN TRANSACTION UPDATE sometable SET aField = 0 WHERE anotherField = 1; UPDATE sometable SET aField = 1 WHERE anotherField = 2; ROLLBACK TRANSACTION; 从C#我们有这样的事情: using (var connection = new SqlConnection(“connection string”)) { connection.Open(); var cmd = connection.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = “my_procedure”; var res = cmd.ExecuteNonQuery(); } 为什么我没有得到res == -1? 我仍然得到受影响的行数。 当文档声明“如果发生回滚,返回值也为-1” […]