Как выбрать поле из Microsoft SQL Server для отправки на c#? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть таблица с SystemId в качестве первичного ключа. Я хочу выбрать @systemid и отправить его в форму c#.

Ниже приведен c# код

SqlCommand cmdfindsystemid = new SqlCommand("FindSystemId", con);
cmdfindsystemid.CommandType = CommandType.StoredProcedure;
cmdfindsystemid.Parameters.Add("@systemid", SqlDbType.Int);
cmdfindsystemid.Parameters["@systemid"].Direction = ParameterDirection.Output;
int systemid = Convert.ToInt32(cmdfindsystemid.Parameters["@systemid"].Value);

Но я не знаю код SQL. Это может быть что-то вроде:

create proc FindSystemId
@systemid int output
as
select SystemId from tbl systems
set @systemid ?????

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Ваш SQL оператор сервера должен выглядеть следующим образом. Здесь @IsSuccess используется в качестве выходного параметра в SQL Server.

Примечание. Могут быть разные способы присвоения значения параметру @IsSuccess, как я назначил -1, 1 и 2 согласно логике c.

Вы можете попробовать это, если ваш основной столбец также является ключом идентификации.

SET @IsSuccess = (SELECT SCOPE_IDENTITY())

Вы также можете использовать . Предложение OUTPUT для операторов INSERT и DELETE .

Чтобы позвонить в C#, вы можете следовать этому предыдущему ответу .

CREATE PROCEDURE [dbo].[AddEditTax] @TaxCode INT
    ,@TaxName VARCHAR(40)
    ,@TaxValue NUMERIC(18, 3)
    ,@IsActive BIT
    ,@UserCode BIGINT
    ,@IsSuccess AS INT OUTPUT
AS
BEGIN
    DECLARE @tempCode BIGINT

    SET @IsSuccess = 0

    IF (@TaxCode <= 0) -- ADD   
    BEGIN
        SET @tempCode = (
                SELECT ISNULL(MAX(TaxCode), 0) + 1 AS TaxCode
                FROM Tax_Mst
                )

        IF (
                NOT EXISTS (
                    SELECT *
                    FROM Tax_Mst
                    WHERE TaxName = @TaxName
                    )
                )
        BEGIN
            INSERT INTO Tax_Mst (
                TaxCode
                ,TaxValue
                ,TaxName
                ,IsActive
                ,CreatedBy
                ,CreatedDate
                )
            VALUES (
                @tempCode
                ,@TaxValue
                ,@TaxName
                ,@IsActive
                ,@UserCode
                ,CONVERT(VARCHAR, getdate(), 109)
                )

            SET @IsSuccess = 1
        END
        ELSE
        BEGIN
            SET @IsSuccess = - 1
        END
    END
    ELSE IF (@TaxCode > 0) -- Update        
    BEGIN
        IF (
                NOT EXISTS (
                    SELECT *
                    FROM Tax_Mst
                    WHERE TaxName = @TaxName
                        AND TaxCode <> @TaxCode
                    )
                )
        BEGIN
            UPDATE Tax_Mst
            SET TaxName = @TaxName
                ,TaxValue = @TaxValue
                ,ModifyBy = @UserCode               
            WHERE TaxCode = @TaxCode

            SET @IsSuccess = 1
        END
        ELSE
        BEGIN
            SET @IsSuccess = 2
        END
    END
END

Я использую ниже метод для вызова вышеуказанной процедуры в C# классе.

public static int AddEditTax(Tax objTax)
{
            int retVal = 0;
            DbCommand objdbCmd;

            try
            {
                String strDBName = BaseClass.GetDatabaseName();
                Database ObjDB;
                ObjDB = DatabaseFactory.CreateDatabase();
                objdbCmd = ObjDB.GetStoredProcCommand("AddEditTax");
                if (objTax.TaxCode.HasValue)
                    ObjDB.AddInParameter(objdbCmd, "TaxCode", DbType.Int32, objTax.TaxCode);
                else ObjDB.AddInParameter(objdbCmd, "TaxCode", DbType.Int64, DBNull.Value);
                ObjDB.AddInParameter(objdbCmd, "TaxName", DbType.String, objTax.TaxName);
                ObjDB.AddInParameter(objdbCmd, "TaxValue", DbType.Decimal, objTax.TaxValue);
                ObjDB.AddInParameter(objdbCmd, "IsActive", DbType.Boolean, objTax.Status);
                ObjDB.AddInParameter(objdbCmd, "UserCode", DbType.Int64, objTax.CreatedBy.Value);
                ObjDB.AddParameter(objdbCmd, "IsSuccess", DbType.Int32, ParameterDirection.Output, "", DataRowVersion.Default, null);
                ObjDB.ExecuteNonQuery(objdbCmd);
                if (ObjDB.GetParameterValue(objdbCmd, "IsSuccess") != DBNull.Value)
                    retVal = Convert.ToInt32(ObjDB.GetParameterValue(objdbCmd, "IsSuccess").ToString());

            }
            catch (Exception objEx)
            {
                ErrorLogDAL objErrorLogManager = new ErrorLogDAL();
                objErrorLogManager.AddErrorLog(objEx);
                objErrorLogManager = null;

            }
            finally
            {

                objdbCmd = null;
            }
            return retVal;
}

Значение выходного параметра на странице может использоваться следующим образом.

int isSuccess = Convert.ToInt32(TaxDAL.AddEditTax(objTax));
if (isSuccess == 1)
{
  ScriptManager.RegisterStartupScript(this, typeof(Page), "Alert1", "alert('Record saved sucessfully.');", true);
 return;
}
else if (isSuccess == 2)
{
 PMessage.InnerHtml = "Record already exists";
 PMessage.Attributes.Add("class", "errorMessageText");
 PMessage.Visible = true;
 return;
}
else
{
 PMessage.InnerHtml = "Record not saved sucessfully";
 PMessage.Attributes.Add("class", "errorMessageText");
 PMessage.Visible = true;
 return;
}

Вы можете сослаться на эту ссылку для ссылка .

0 голосов
/ 11 марта 2020

Вы должны вызвать метод ExecuteNonQuery из SqlCommand перед чтением параметра. Для образца:

SqlCommand cmdfindsystemid = new SqlCommand("FindSystemId", con);
cmdfindsystemid.CommandType = CommandType.StoredProcedure;
cmdfindsystemid.Parameters.Add("@systemid", SqlDbType.Int);
cmdfindsystemid.Parameters["@systemid"].Direction = ParameterDirection.Output;

cmdfindsystemid.ExecuteNonQuery();

int systemid = Convert.ToInt32(cmdfindsystemid.Parameters["@systemid"].Value);
...