2015-08-19 65 views
-1

我有下面的C#代码来检查记录是否存在,插入并返回id。但如果记录存在,我也需要返回值。我应该对C#和SQL部分做出什么改变才会发生?数据库是sQL服务器。我仍然必须为此使用ExecuteScalar()吗?如果记录存在则返回ID,否则插入并返回ID

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; 
+3

也许你需要MERGE语句 – Steve

+0

也许拆分语句。只在if块中插入。选择外面。 SQL对缓存来说非常好,如果你刚刚插入了一些东西,选择它可能会非常快。此外,查询很难阅读,请使用@开头,将其制作成多行字符串。 – MrFox

+1

这看[Little Bobby Tables](http://bobby-tables.com/)不知道。 –

回答

1

有很多种方法来实现这一目标。 1)你可以在Sql 2中完成所有工作)你可以在存储过程中完成所有工作。 3)你可以在代码中完成所有的工作,但是分割代码的时候,因为这段代码坦白地说太多了。一般来说,我会避免在同一个方法中插入/查询。

也尝试使用SqlParameters而不是构建查询作为字符串concat。

我会提出这样的,这使得代码有点更具可读性

public int InsertAndRetrieveClientRefId(string clientRefTypeName) 
    { 
     int id = GetIdIfRecordExists(clientRefTypeName); 

     if (id == 0) 
     { 
      // insert logic here 

      id = GetIdIfRecordExists(clientRefTypeName); 
     } 

     return id; 
    } 

    public int GetIdIfRecordExists(string clientRefTypeName) 
    { 
     int id = 0; 

     string command = "select id from ClinRefFileTypeMaster where ClinRefTypeName = @ClinRefTypeName"; 
     SqlParameter nameParameter = new SqlParameter("@ClinRefTypeName", System.Data.SqlDbType.NVarChar, 10) { Value = clientRefTypeName }; 

     using (SqlConnection connection = new SqlConnection("ConnectionString")) 
     { 
      using (SqlCommand cmd = new SqlCommand(command)) 
      { 
       cmd.Parameters.Add(newParameter); 
       connection.Open(); 
       cmd.Connection = connection; 
       int.TryParse(cmd.ExecuteScalar().ToString(), out id); 
      } 
     } 

     return id; 
    } 
+0

谢谢,这对我工作,因为使用商店程序不是我的选择。我想你只会忘记将nameParameter添加到命令中!我做到了,而且效果很好。 – user3033921

+0

很高兴它的工作。我已经更新了答案,将参数添加到命令中。 – Qudoos

1

youll需要添加一个IF EXISTS子句的SQL语句,以及,检查在相同的条件,并提供逻辑返回一个值。

似乎使用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

返回值存储过程来完成所有的东西,你会看起来像.....

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); 
+1

是的,我强烈地重复这种方式!更安全,更容易维护。 – CiucaS

1

做这一切在数据库中即存储过程

if not exists (select 1 from [ClinRefFileTypeMaster] where [ClinRefTypeName] [email protected]) 
begin 
Insert into [ClinRefFileTypeMaster] ([ClinRefTypeName]) values (@name) 
end 
else 
begin 
select (as desired) from ClinRefFileTypeMaster where where [ClinRefTypeName] [email protected] 
end 

这要么插入新记录或将选择已插入的信息

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 

如果你想通过查询字符串,可以调用select查询,如果返回null执行插入opeartion和使用scope_Identity()得到ID

INSERT INTO YourTable(val1, val2, val3 ...) 
VALUES(@val1, @val2, @val3...); 
SELECT SCOPE_IDENTITY(); 
相关问题