Tag: sql server

一次将datagridview的所有数据插入数据库

我有一个datagridview,它由各种操作和用户对数据的操作创建。 我想立即将gridview的所有数据插入数据库,我知道我可以尝试类似这样的代码: for(int i=0; i< dataGridView1.Rows.Count;i++) { string StrQuery= @"INSERT INTO tableName VALUES (" + dataGridView1.Rows[i].Cells["ColumnName"].Value +", " + dataGridView1.Rows[i].Cells["ColumnName"].Value +");"; try { using (SqlConnection conn = new SqlConnection(ConnString)) { using (SqlCommand comm = new SqlCommand(StrQuery, conn)) { conn.Open(); comm.ExecuteNonQuery(); } } } 但每次插入记录时创建新连接是否公平? 数据网格可能包含很多行…有没有办法一次性将所有数据传递到服务器并在sql中循环插入所有数据?

使用CancellationToken取消SQL Server查询

我在SQL Server中有一个长时间运行的存储过程,我的用户需要能够取消它。 我编写了一个如下的小测试应用程序,它演示了SqlCommand.Cancel()方法非常好用: private SqlCommand cmd; private void TestSqlServerCancelSprocExecution() { TaskFactory f = new TaskFactory(); f.StartNew(() => { using (SqlConnection conn = new SqlConnection(“connStr”)) { conn.InfoMessage += conn_InfoMessage; conn.FireInfoMessageEventOnUserErrors = true; conn.Open(); cmd = conn.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = “dbo.[CancelSprocTest]”; cmd.ExecuteNonQuery(); } }); } private void cancelButton_Click(object sender, EventArgs e) { if (cmd != […]

如何使用.net实现SQL IN()的等价物

在.net(c#或vb)表达式中,您将如何实现SQL的便捷IN()function? 即(1,2,4,7)中的值 而不是: value = 1或value = 2或value = 4或value = 7

SQL OUTPUT存储过程不与ExecuteReader一起使用

在SQL 2008和C#4.0上使用存储过程时,我无法检索OUTPUT信息并从Select语句返回信息。 我不断得到“对象引用未设置为对象的实例”。 当我执行ExecuteScalar()时,我获取行,但不是数据。 在那里找到了几个例子,它们看起来像我正在做的事情,所以我想我在我面前缺少一些简单的东西。 谢谢。 存储过程 USE [PhoneDb] GO /****** Object: StoredProcedure [dbo].[TestPagingProcedure] Script Date: 06/16/2011 08:39:03 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[TestPagingProcedure] — Add the parameters for the stored procedure here @startRowIndex int, @maximumRows int, @totalRows int OUTPUT AS BEGIN — SET NOCOUNT ON added to prevent […]

如果禁用MSDTC,如何绕过TransactionScope内的多个数据库连接?

我有一个Web应用程序,它向DAL中的3个数据库发出请求。 我正在编写一些集成测试,以确保整个function往返实际上完成了我期望它做的事情。 这与我的unit testing完全分开,只是fyi。 我打算写这些测试的方式是这样的 [Test] public void WorkflowExampleTest() { (using var transaction = new TransactionScope()) { Presenter.ProcessWorkflow(); } } 在这种情况下,Presenter已经建立。 问题在ProcessWorkflow方法中发挥作用,因为它调用各种存储库,而这些存储库又访问不同的数据库,而我的sql server框没有启用MSDTC,所以每当我尝试创建新的sql连接时,我都会收到错误,或者尝试更改缓存连接的数据库以定位另一个数据库。 为简洁起见,Presenter类似于: public void ProcessWorkflow() { LogRepository.LogSomethingInLogDatabase(); var l_results = ProcessRepository.DoSomeWorkOnProcessDatabase(); ResultsRepository.IssueResultstoResultsDatabase(l_results); } 我已经尝试了很多东西来解决这个问题。 始终缓存一个活动连接并更改目标数据库 为每个目标数据库缓存一个活动连接(这有点无用,因为池应该为我做这个,但我想看看我是否得到了不同的结果) 在每个存储库中添加其他TransactionScope,以便使用TransactionScopeOption“RequiresNew”拥有自己的事务 我在列表上的第三次尝试看起来像这样: public void LogSomethingInLogDatabase() { using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew)) { //do some database work […]

通过Entity Framework将表值类型传递给SQL Server存储过程

我在SQL Server中创建了一个用户定义的表类型: CREATE TYPE dbo.TestType AS TABLE ( ColumnA int, ColumnB nvarchar(500) ) 我正在使用存储过程将记录插入数据库: create procedure [dbo].[sp_Test_CustomType] @testing TestType READONLY as insert into [dbo].[myTable] select ColumnA, ColumnB from @testing 我想使用EF来执行此存储过程,但问题是:如何将用户定义的表传递给存储过程? 我尝试将存储过程添加到模型中,但我无法在更新的上下文中找到所需的存储过程。 我要做的是对表执行批量插入,这是我目前使用的方法: List itemToInsertToDB = //fetchItems; foreach(items i in itemToInsertToDB) { context.sp_InsertToTable(i.ColumnA, i.ColumnB) } 目前,我使用foreach循环遍历列表以将项目插入到DB,但如果列表中有很多项目,那么就会出现性能问题,因此,我正在考虑将列表传递给存储过程并在里面插入。 那么如何解决这个问题呢? 或者有更好的方法吗?

C#中SQL Server存储过程的异步调用

是否可以通过C# 异步调用SQL Server存储过程 ? 我有一个存储过程写一个特定数据库的备份(这可能需要很长时间才能完成),我想在Windows窗体中显示备份过程的进度(为此我使用http://www.wisesoft .co.uk / articles / tsql_backup_restore_progress.aspx )。 或者我应该使用Backgroundworker控件并在backgroundjob(自己的线程)中运行SP?

为什么SqlParameter名称/值构造函数将0视为null?

我在一段代码中发现了一个奇怪的问题,即即使其参数与数据源中的记录匹配,adhoc SQL查询也没有产生预期的输出。 我决定将以下测试表达式输入到即时窗口中: new SqlParameter(“Test”, 0).Value 这给了null的结果,让我挠头。 似乎SqlParameter构造函数将零视为空值。 以下代码生成正确的结果: SqlParameter testParam = new SqlParameter(); testParam.ParameterName = “Test”; testParam.Value = 0; // subsequent inspection shows that the Value property is still 0 谁能解释这种行为? 这是故意的吗? 如果是这样,它可能相当危险……

T-Sql中的时间戳在C#中意味着什么?

我正在尝试开发一个模型对象来保存一个Sql Server行,我完全理解除了T-Sql / SqlServer时间戳之外如何做到这一点。 该表定义为: CREATE TABLE activity ( activity_id int , ip_address varchar(39) , user_id varchar(255) , message_text , dt timestamp ) 当我将表行解析为我的对象时,对于int或字符串,我希望做类似的事情: ActivityID = (int)dataReader[“activity_id”]; IPAddress = (string)dataReader[“ip_address”]; 但是我该如何处理时间戳列? 我可以在任何地方找到没有“timestamp”数据类型。 我知道Sql Server将时间戳存储为8字节的二进制文件,但这通常与.NET中的相同? 编辑添加:一些额外的信息……这是从我们的大型机上的DB2表返回的一行,来自Sql Server视图。 “Rowversion”不是一个选项,DB2正在将列作为时间戳处理。 如果timestamp和rowversion相同,也许我可以将它视为一个,但否则我会遇到时间戳。 再次编辑补充说:这个项目将让我疯狂。 它至少会是一次短途旅行。 无论如何,是的@JoelC这是一个Sql Server视图,进入大型机上的DB2数据库。 我终于能够找到我们的一位DBA,他们轻蔑地解释说“当然”DB2 TIMESTAMP在Sql Server视图中遇到日期时间。 根据他的语调,我猜只有新手不知道这一点。 这就是为什么他在实际视图中将其命名为“datetime”,Duh! (我在我的示例中给它一个不同的名称,以便不触发对命名约定的评论 – 实际的数据模型图表示它是TIMESTAMP并将其命名为时间戳)。 所以,在这种情况下,显然必须将其转换为DateTime。 我想我可能会开始考虑成为一名DBA,这样我也可以让程序员疯狂。 对不起,如果我误导了这个问题的任何响应者 – 这是无意的,因为我实际上期待时间戳是一个时间戳。 […]

C#SQLServer检索结果并以.csv格式放置

我看了一下网站和谷歌,但我似乎无法找到一个很好的解决方案,我正在尝试做什么。 基本上,我有一个客户端服务器应用程序(C#),我向服务器发送一个SQL select语句(连接到SQL Server 2008),并希望以CSV方式将结果返回给客户端。 到目前为止,我有以下内容: if (sqlDataReader.HasRows) { while(sqlDataReader.Read()) { //not really sure what to put here and if the while should be there! } } 不幸的是,我真的很想将C#与SQL连接起来。 我需要有关如何简单地将结果放在csv格式的字符串中的任何提示。 列和字段可能不同,所以我不能使用某些东西的方法,就像我在一些网站上看到的那样。 我不确定我是否可以理解了! 我非常感谢有关如何解决这个问题的任何提示/要点!