如果我使用SqlCommand运行存储过程并且SqlCommand超时,StoredProc会继续执行还是在SqlCommand断开连接时强行退出?
我在互联网上搜索,一切似乎都是关于个别领域或做一个插入.我有一个迁移工具,它从旧的遗留数据库(superbase)迁移到我们的SQL服务器数据库(2008).目前,我正在从旧数据库中读取20,000条记录,并生成一个SQLCommand.CommandText包含分号分隔的20,000个插入语句的大字符串.这很好用.但我可以做25k吗?30K?我试着没有任何限制,但当我试图运行ExecuteNonQuery一个CommandText包含超过400万个INSERT语句时,它说了一些关于太久的事情.我不记得确切的错误信息,抱歉.我找不到有关确切限制的任何文档.对我来说很重要,因为我可以一次点火的插入越多,整个过程就越快.任何建议/链接/文档将不胜感激,谢谢!
我有一个SQLCommand:
"更新客户设置名称= @name其中code = @code"
而这段代码:
cmd.Parameters[0].Value = "?????";//(some Unicode characters)
cmd.Parameters[1].Value = 1;
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
或者这段代码:
UpdateCommand.CommandText = "UPDATE [Customers] SET [Name] = @p1 WHERE (([Code] = @p2) AND ((@p3 = 1 AND [Name] IS NULL) OR ([Name] = @p4)))";
UpdateCommand.Parameters.Add("@p1", System.Data.SqlDbType.SmallInt, 0, "Name");
UpdateCommand.Parameters.Add("@p2", System.Data.SqlDbType.NVarChar, 0, "Code");
UpdateCommand.Parameters.Add("@p3", System.Data.SqlDbType.NText, 0, "Name");
UpdateCommand.Parameters.Add("@p4", System.Data.SqlDbType.SmallInt, 0, "Name");
Run Code Online (Sandbox Code Playgroud)
当我选择客户表时,我有很多"?".
为什么SQLCommand在使用SQLDataAdapter时工作正常?
如何将我的Unicode数据转换为ANSI?
编辑:
换句话说:
SQLDataAdapter使用什么代码?
任何人都有.net框架的那部分的源代码?
我有一些像这样lloks的Transact-SQL,它可以通过SqlCommand对象执行,还是我需要开始学习Sql管理对象?
BEGIN TRANSACTION
BEGIN TRY
IF NOT EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = (SELECT DB_NAME())
AND TABLE_NAME = 'SchemaVersion'
)
BEGIN
Print 'Migrating up...'
CREATE TABLE SchemaVersion (
Id INT IDENTITY(1,1) NOT NULL,
Version INT NOT NULL,
CONSTRAINT PK_SchemaVersion PRIMARY KEY CLUSTERED (
Id ASC
)
)
INSERT INTO SchemaVersion (Version) VALUES(1)
PRINT 'Migrated from 0 to 1'
END
ELSE IF (SELECT Version FROM SchemaVersion) = 1
BEGIN
Print 'Migrating down...'
DROP TABLE Dia_SchemaVersion
PRINT 'Migrated from …Run Code Online (Sandbox Code Playgroud) 我的数据层的一些方法中有以下代码:
StringBuilder sb = new StringBuilder();
SqlCommand s = new SqlCommand(sb.ToString(), conn);
try
{
SqlDataReader dr = s.ExecuteReader();
while(dr.Read())
DoSomething(dr);
}
catch (Exception ex)
{
sb.Append(Util.ExceptionRecursive(ex));
}
Run Code Online (Sandbox Code Playgroud)
事情是,博士永远不会在例外的情况下关闭.当其他方法试图访问另一个数据读取器时,它会抛出另一个异常,例如"另一个数据扩展器连接到数据库"
我想在任何情况下关闭我的DataReader.但是这个:
sb = new StringBuilder();
SqlCommand s = new SqlCommand(sb.ToString(), conn);
SqlDataReader dr;
try
{
dr = s.ExecuteReader();
while(dr.Read())
DoSomething(dr);
}
catch (Exception ex)
{
sb.Append(Util.ExceptionRecursive(ex));
}
finally
{
dr.Close();
}
Run Code Online (Sandbox Code Playgroud)
不会工作,因为如果异常dr可能没有数据,并且不会编译.
那我该怎么办?
我在WCF Web服务中有以下代码片段,它根据提供的字典值的格式构建一组where条件.
public static Dictionary<string, string>[] VehicleSearch(Dictionary<string, string> searchParams, int maxResults)
{
string condition = "";
foreach (string key in searchParams.Keys)
{
//Split out the conditional in case multiple options have been set (i.e. SUB;OLDS;TOY)
string[] parameters = searchParams[key].Split(';');
if (parameters.Length == 1)
{
//If a single condition (no choice list) check for wildcards and use a LIKE if necessary
string predicate = parameters[0].Contains('%') ? " AND {0} LIKE @{0}" : " AND {0} = @{0}";
condition += String.Format(predicate, key); …Run Code Online (Sandbox Code Playgroud) 我正在尝试备份我的MySQL数据库并压缩文件.
每次我尝试运行此命令时......
C:\wamp\bin\mysql\mysql5.5.24\bin\mysqldump.exe -u usernam -ppassword db_name | gzip > sites\www.site.com-local\backups\backup-date.sql.gz
Run Code Online (Sandbox Code Playgroud)
我得到的只是一个错误,说"'gzip'不被识别为内部或外部命令,可操作程序或批处理文件'
我使用了以下资源,希望他们能提供帮助,但什么也没做
http://www.zigpress.com/2009/04/09/enabling-gzip-on-wamp/ http://dnhome.wordpress.com/2011/10/06/apache-wampserver-enable-compression-gzip/ http://www.dewebbouwmeester.nl/enabling-gzip-on-wamp/
所有人都说同样的事情但没有任何反应.
有人可以对我做错了吗?
我试图只使用一个连接并一起运行两个命令,一个使用事务,一个不使用.
没有跟踪/日志记录功能,因为此解决方案部署在另一个位置.因此,当流程部分失败时,我至少可以按照日志进行操作.
我将在这里添加我的测试代码:
SqlConnection connection = GetConnection();
SqlTransaction transaction = null;
try
{
connection.Open();
transaction = connection.BeginTransaction();
SqlCommand logCommand = new SqlCommand("Log before main command", connection);
logCommand.ExecuteNonQuery();
string sql = "SELECT 1";
SqlCommand command = new SqlCommand(sql, connection, transaction);
int rows = command.ExecuteNonQuery();
logCommand = new SqlCommand("Log after main command", connection);
logCommand.ExecuteNonQuery();
// Other similar code
transaction.Commit();
command.Dispose();
}
catch { /* Rollback etc */ }
finally { /* etc */ }
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery要求命令具有事务.该命令的Transaction属性尚未初始化.
如果没有其他无交易连接,有没有办法实现我想要做的事情?
或者,如果有一个更好的建议,以不同的方式通过单个连接优化我的代码,我就可以开始学习它.
我已将我的应用程序精简到最小的 POC,但仍然得到相同的效果。看来 ExecuteScalarAsync 的行为类似于同步调用。我认为,当遇到等待时,异步方法中的其余代码将暂停,并且消息泵返回并从消息队列获取另一条消息,从而允许 UI 继续。当标量调用完成时,异步方法的剩余部分将被放回到消息队列中,以便它完成。
当这个小应用程序运行时,TestConnectionAsync 方法会挂起 UI,并且不会执行其他消息,直到 ExecuteScalarAsync 调用超时。
我做错了什么,还是这个异步方法的行为像同步方法?
该表单有两个按钮。第一个运行异步方法,第二个尝试使用令牌取消异步方法。我从来没有机会点击第二个按钮。
Form1.cs
public partial class Form1 : Form
{
private DB _db = new DB();
private string _nl = Environment.NewLine;
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "Starting" + _nl;
string resultString
= (string) await _db.TestConnectionAsync();
textBox1.AppendText(resultString + _nl);
textBox1.AppendText("Done" + _nl);
}
private void button2_Click(object sender, EventArgs e)
{
textBox1.AppendText("Cancelling..." + _nl);
_db.CancelTest();
textBox1.AppendText("Submitted Cancel Token" + _nl);
} …Run Code Online (Sandbox Code Playgroud) 尝试将参数传递给 DO 块时,出现错误“42883:运算符不存在:整数=@整数”Npgsql.PostgresException:
var cmd = new NpgsqlCommand();
cmd.CommandText =
@"DO $$
BEGIN
IF EXISTS (SELECT id FROM pub.table1 WHERE id = @id) THEN
UPDATE pub.table1
SET Field1 = @Field1
,Field2 = @Field2
WHERE id = @id;
ELSE
INSERT INTO pub.table1 (id, Field1, Field2)
VALUES (@id, @Field1, @Field2);
END IF;
END $$;";
cmd.Parameters.AddWithValue("@id", 1);
cmd.Parameters.AddWithValue("@Field1", "text");
cmd.Parameters.AddWithValue("@Field2", "text2");
Run Code Online (Sandbox Code Playgroud)
否则,与 postgres 的连接可以工作,并且(经典)查询在传递参数时也可以工作;例如:
cmd.CommandText = @"SELECT * FROM pub.table1 WHERE id = @id;";
Run Code Online (Sandbox Code Playgroud)
是否无法将参数传递给“DO”块,或者我遗漏了什么?
谢谢。中号
sqlcommand ×10
c# ×7
sql-server ×3
.net ×2
sql ×2
t-sql ×2
.net-1.1 ×1
async-await ×1
asynchronous ×1
command-line ×1
database ×1
migration ×1
mysql ×1
mysqldump ×1
npgsql ×1
postgresql ×1
timeout ×1
unicode ×1