簡體   English   中英

如何在C#中聲明sql變量

[英]How to declare sql variable in C#

我的要求是從表中刪除所有記錄,但只有一個記錄。 為此,我正在執行一系列兩個不同的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] ;

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();
        }
    }
}

我的QQ

  1. 如何在 C# 中正確聲明sql變量(請參閱ClearData方法)
  2. 而且,如何在單個查詢字符串中執行多個查詢?(如果我這樣做是正確的)

編輯

我想出了這個來完成這個。 不過現在運氣還是不錯的。 請告訴我該怎么做:

IF OBJECT_ID ( 'uspWageDataByState', 'P' ) IS NOT NULL 
    DROP PROCEDURE uspWageDataByState;
GO

CREATE PROCEDURE uspWageDataByState
    @State NVARCHAR(2)  
AS

    DECLARE @int INT
    SET @int  =  (SELECT COUNT(*) 
    FROM [Test] 
    WHERE [STATE] = @State)

    DELETE TOP (@int - 1 ) 
    FROM [Test]
    WHERE [STATE] = @State;

GO

exec uspWageDataByState 'CO'

我在我的環境中完全運行了這段代碼,它按預期工作。

我的框架版本是 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();
                }
            }
        }
    }
}

也許這可以幫助您,更改您的查詢(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 崩潰。

在單個字符串語句中執行多個查詢:

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

以這種方式在 aspnet sqlcommanddatareader

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM