C# 如何在C中声明sql变量
我的要求是从表中删除除一条以外的所有记录。为此,我将执行一系列两个不同的sql命令。似乎在ssms上它可以正常工作,但在C上则不行C# 如何在C中声明sql变量,c#,sql,sql-server,sql-server-2008,database-connection,C#,Sql,Sql Server,Sql Server 2008,Database Connection,我的要求是从表中删除除一条以外的所有记录。为此,我将执行一系列两个不同的sql命令。似乎在ssms上它可以正常工作,但在C上则不行 --This is what I run on ssms without any issue DECLARE @int INT; SELECT @int = COUNT(*) FROM [Table] WHERE STATE = 'CO'; --Delete statement DELETE TOP (@int - 1 ) FROM [Table] ;
--This is what I run on ssms without any issue
DECLARE @int INT;
SELECT @int = COUNT(*)
FROM [Table]
WHERE STATE = 'CO';
--Delete statement
DELETE TOP (@int - 1 )
FROM [Table] ;
public static void ClearData(string state)
{
const string queryToExec = @"DECLARE @int INT;" +
"SELECT @int = COUNT(*) " +
"FROM [Table] " +
"WHERE STATE = @State;" +
"DELETE TOP (@int - 1 ) " + //NOTICE THIS LINE
"FROM [Table] ";
List<SqlParameter> param = new List<SqlParameter>()
{
new SqlParameter {ParameterName = "@State", SqlDbType = SqlDbType.VarChar, Value = state},
};
ExecQuery(queryToExec, param);
}
public static void ExecQuery(string query, List<SqlParameter> paramCollection = null)
{
using (SqlConnection conn = new SqlConnection(ConnString))
{
using (SqlCommand mySqlCom = new SqlCommand())
{
mySqlCom.CommandText = query;
if (paramCollection != null) mySqlCom.Parameters.AddRange(paramCollection.ToArray());
mySqlCom.Connection = conn;
conn.Open();
mySqlCom.ExecuteNonQuery();
}
}
}
也许这可以帮助您更改查询queryToExec,方法是:
ALTER PROCEDURE uspWageDataByState
@State NVARCHAR(2)
AS
DELETE TOP
(CASE
(SELECT COUNT(*) FROM [Test] WHERE [STATE] = @State)
WHEN 0 THEN 1
ELSE (SELECT COUNT(*) FROM [Test] WHERE [STATE] = @State) END -1)
FROM [Test]
WHERE [STATE] = @State;
如果声明的变量是您可以解决的问题,那么它不是最好的查询,但是您使用的任何形式也不是最好的形式:p
我正在添加一个0行验证,换句话说,sp在找不到数据时崩溃。我已经在我的环境中运行了这段代码,它正在按预期工作 我的框架版本是4.5.51641,我的SQL版本是SQL Server 11.0.2100
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
namespace PruebasSQL
{
class Program
{
const string ConnString = @"";
static void Main(string[] args)
{
ClearData("A");
}
public static void ClearData(string state)
{
const string queryToExec = @"DECLARE @int INT;" +
"SELECT @int = COUNT(*) " +
"FROM [Table] " +
"WHERE STATE = @State;" +
"DELETE TOP (@int - 1 ) " + //NOTICE THIS LINE
"FROM [Table] ";
List<SqlParameter> param = new List<SqlParameter>()
{
new SqlParameter {ParameterName = "@State", SqlDbType = SqlDbType.VarChar, Value = state},
};
ExecQuery(queryToExec, param);
}
public static void ExecQuery(string query, List<SqlParameter> paramCollection = null)
{
using (SqlConnection conn = new SqlConnection(ConnString))
{
using (SqlCommand mySqlCom = new SqlCommand())
{
mySqlCom.CommandText = query;
if (paramCollection != null) mySqlCom.Parameters.AddRange(paramCollection.ToArray());
mySqlCom.Connection = conn;
conn.Open();
mySqlCom.ExecuteNonQuery();
}
}
}
}
}
在单个字符串语句中执行多个查询:
string querystring = "select [yourcolumns] from [yourtable];select [yourvalues] from [yourtables]";
sqlcommand cmd = new sqlcommand(querystring,yourconnection);
sqlDataReader reader = cmd.executeReader();
do
{
while(reader.Read())
{
//get your values here
}
}while(reader.NextResult());
这样在aspnet sqlcommand和datareader中工作最好创建一个存储过程并调用它。@RahulSingh感谢您的建议。我不能在数据库中存储任何东西,老实说,我确信这不是最好的方法。你能给我写一个这两条语句的存储过程吗。我不是一个SQLEXXPert,我需要在我的C代码中做所有的事情。我不能重复这一点——这对我来说很有效。在批处理中声明多个语句是很好的—ORM和数据访问层一直都在这样做,例如在准备sp_executesql时。良好的实践建议转义列[State],并显式设置cmd.CommandType=Text,但这是默认设置。根据拉胡尔的说法,这个过程也是个好主意。出于兴趣,您是否也希望删除[State]=“co”,否则您将删除所有记录?@Rahussing我创建了您建议的存储专业版,但无法正常工作请告诉我wrong@StuartLC请参阅存储过程。Thanks5=一页中的行数,顺便说一下,您可以将参数添加到页码中,1=页码
string querystring = "select [yourcolumns] from [yourtable];select [yourvalues] from [yourtables]";
sqlcommand cmd = new sqlcommand(querystring,yourconnection);
sqlDataReader reader = cmd.executeReader();
do
{
while(reader.Read())
{
//get your values here
}
}while(reader.NextResult());
DECLARE @PageSize INT = 5, @PageNum INT = 1
SELECT tickets.ID, tickets.userID FROM tickets WHERE tickets.isActive = 1
OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY