我如何 select 来自 Microsoft SQL 服务器的字段发送到 c#?
How can I select a field from Microsoft SQL Server to send to c#?
我有一个 table,其中 SystemId
作为主键。我想select @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 ?????
在读取参数之前,您必须从 SqlCommand
调用 ExecuteNonQuery
方法。例如:
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);
您的 SQL 服务器声明应如下所示。这里@IsSuccess
作为SQLServer中的输出参数。
注意:可能有不同的方法将值分配给参数 @IsSuccess
,因为我已经按照逻辑分配了 -1
、1
和 2
。
如果您的主列也是标识键,您可以试试这个。
SET @IsSuccess = (SELECT SCOPE_IDENTITY())
您也可以使用 The OUTPUT Clause for INSERT and DELETE Statements.
要在 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# 中调用上面的过程 class。
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;
}
您可以参考此 link 以获取 reference。
我有一个 table,其中 SystemId
作为主键。我想select @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 ?????
在读取参数之前,您必须从 SqlCommand
调用 ExecuteNonQuery
方法。例如:
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);
您的 SQL 服务器声明应如下所示。这里@IsSuccess
作为SQLServer中的输出参数。
注意:可能有不同的方法将值分配给参数 @IsSuccess
,因为我已经按照逻辑分配了 -1
、1
和 2
。
如果您的主列也是标识键,您可以试试这个。
SET @IsSuccess = (SELECT SCOPE_IDENTITY())
您也可以使用 The OUTPUT Clause for INSERT and DELETE Statements.
要在 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# 中调用上面的过程 class。
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;
}
您可以参考此 link 以获取 reference。