我有以下C#代码来检查记录是否不存在,插入并返回id。但是,如果记录存在,我也需要它返回值。我应该对C#和SQL部分做些什么改变呢?数据库是sQL服务器。我还需要使用ExecuteScalar()吗?
con.Open();
// Insert ClinRefFileTypeMaster
string command1 = string.Format(
"if NOT exists (select * from [ClinRefFileTypeMaster] where [ClinRefTypeName] = '{0}') Insert into [ClinRefFileTypeMaster] ([ClinRefTypeName]) output INSERTED.[ClinRefTypeID] VALUES('{0}')",
dataToParse[i][0]
);
SqlCommand ClinRefFileTypeMaster = new SqlCommand(command1, con);
// check if there is an value
object checkValue = ClinRefFileTypeMaster.ExecuteScalar();
if (checkValue != null)
ClinRefFileTypeId = (int)checkValue;
答案 0 :(得分:1)
您还需要在SQL语句中添加IF EXISTS子句,检查相同的条件,并提供返回值的逻辑。
如果你需要它来从数据库返回值,似乎使用ExecuteReader会更好。
2¢ 我个人会将逻辑分成两个查询并在c#中运行If语句,检查值是否在数据库中,然后更新数据库,否则从数据库返回一个值
conn.open()
int CheckDb;
String Command1 = "select * from [ClinRefFileTypeMaster] where [ClinRefTypeName] = @ClinRefFileTypeId";
using (SqlCommand ClinRefFileTypeMaster = new SqlCommand(command1, con);
{
cmd.Parameters.AddWithValue("@ClinRefFileTypeId", {0});
CheckDb = (int)ClinRefFileTypeMaster.ExecuteScalar();
}
If (CheckDb != 0)
//Logic for returning the value from the database
Else
//Here you can request user check data or insert the value into the database.
答案 1 :(得分:1)
为你做所有事情的存储过程看起来像......
CREATE PROCEDURE usp_Get_ClinRefTypeID
@ClinRefTypeName VARCHAR(100),
@ClinRefTypeID INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @NewID TABLE(ClinRefTypeID INT);
SELECT @ClinRefTypeID = [ClinRefTypeID]
FROM [ClinRefFileTypeMaster]
where [ClinRefTypeName] = @ClinRefTypeName;
IF (@ClinRefTypeID IS NULL)
BEGIN
INSERT INTO [ClinRefFileTypeMaster] ([ClinRefTypeName])
OUTPUT inserted.[ClinRefTypeID] INTO @NewID(ClinRefTypeID)
VALUES(@ClinRefTypeName)
SELECT @ClinRefTypeID = [ClinRefTypeID] FROM @NewID
END
END
你的C#代码看起来像......
con.Open();
// Insert ClinRefFileTypeMaster
SqlCommand cmd = new SqlCommand("usp_Get_ClinRefTypeID", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@ClinRefTypeID", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.Parameters.Add(new SqlParameter("@ClinRefTypeName", dataToParse));
// get the value back from the output parameter
cmd.ExecuteNonQuery();
int ClinRefTypeName = Convert.ToInt32(cmd.Parameters["@ClinRefTypeID"].Value);
答案 2 :(得分:1)
在数据库中进行所有这些操作,即在商店程序中
if not exists (select 1 from [ClinRefFileTypeMaster] where [ClinRefTypeName] =@name)
begin
Insert into [ClinRefFileTypeMaster] ([ClinRefTypeName]) values (@name)
end
else
begin
select (as desired) from ClinRefFileTypeMaster where where [ClinRefTypeName] =@name
end
这将插入新记录,或者它将选择已插入的信息
答案 3 :(得分:1)
有很多方法可以实现这一目标。 1)您可以在内联Sql中完成所有操作2)您可以在存储过程中完成所有操作。 3)你可以在代码中完成所有操作但是拆分代码,因为这段代码坦率地做了太多。一般来说,我会避免使用相同的方法插入/查询。
还尝试使用SqlParameters而不是将查询构建为字符串concat。
我会提出类似这样的代码,使代码更具可读性
{{1}}
答案 4 :(得分:1)
如果你想执行Instert操作,我认为你调用存储过程并在程序中编写查询会更好。它会更安全。
SqlCommand command = new SqlCommand("procedureName",con);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue(“@value1”, txtValue1.Text);
command.Parameters.AddWithValue(“@value2”, Value2);
int value = command.ExecuteScalar();
IF EXISTS (SELECT 1 FROM Table WHERE FieldValue='')
BEGIN
SELECT TableID FROM Table WHERE FieldValue=''
END
ELSE
BEGIN
INSERT INTO TABLE(FieldValue) VALUES('')
SELECT SCOPE_IDENTITY() AS TableID
END
如果您想传递查询字符串,可以调用选择查询,如果它返回null
执行插入操作并使用scope_Identity()
获取ID
INSERT INTO YourTable(val1, val2, val3 ...)
VALUES(@val1, @val2, @val3...);
SELECT SCOPE_IDENTITY();