2015-08-19 97 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(); 
相關問題