2015-08-19 3 views
-1

У меня есть код ниже, чтобы проверить, нет ли записи, вставить и вернуть идентификатор. Но также, если запись существует, она возвращает значение. Какое изменение следует внести в C# и SQL-часть для этого? База данных - это сервер sQL. Должен ли я использовать ExecuteScalar() для этого?Идентификатор возврата, если запись существует, иначе Вставка и возврат 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

Спасибо, это сработало для меня, так как использование магазина не было для меня вариантом. Я думаю, вы только забыли добавить имяПараметр в команду! Я сделал это, и он отлично поработал. – user3033921

+0

рад, что он сработал. Я обновил ответ, чтобы добавить параметр в команду. – Qudoos

1

Youll необходимо добавить IF EXISTS пункт в заявлении SQL, а также, проверка на тех же условиях, и обеспечивая логику для возврата значения.

Кажется, что использование ExecuteReader было бы лучше, если бы вам нужно было вернуть значение из базы данных.

2 ¢ Я бы лично разделить логику в двух запросов и запустить заявление, если в C# проверить, если значение находится в базе данных, то обновление базы данных еще возвращает значение из базы данных

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 

Если вы хотите передать строку запроса, вы можете позвонить выберите запрос, и если он возвращает null выполнить вставку opeartion и использовать scope_Identity(), чтобы получить ID

INSERT INTO YourTable(val1, val2, val3 ...) 
VALUES(@val1, @val2, @val3...); 
SELECT SCOPE_IDENTITY(); 
Смежные вопросы