2015-02-15 2 views
-1

У меня есть база данных SQL Server с таблицами с таблицами. Мой ввод - это номер IMEI, который я должен хранить в таблице, только если этот номер IMEI не сохраняется во всех таблицах. мой код:Поиск дубликата числа в парах таблиц SQL Server в C#

public int Find_IMEI(string IMEI_NUM) 
{ 
     IMEI_lab.Text = IMEI_NUM.ToString(); 
     int dflag = 0; 
     object result; 

     SqlConnection sqlConn = new SqlConnection(@"Data Source=\SQLEXPRESS;Initial Catalog=manager_db;Integrated Security=True;Pooling=False"); 
     sqlConn.Open(); 
     int test = 0; 

     for(int kk = 0; kk < comboBox2.Items.Count; kk++) 
     { 
      string data_sql = string.Format("IF EXISTS(SELECT 1 FROM {0} WHERE IMEI={1}) SELECT 1 AS FOUND ELSE SELECT 0 AS FOUND", data[kk], IMEI_NUM); 
      SqlCommand da = new SqlCommand(data_sql, sqlConn); 
      result = da.ExecuteScalar(); // ExecuteScalar fails on null 

      if (result.GetType() == typeof(DBNull)) // checking IMEI number in all Tables(orders) 
      { 
       dflag = 0; 
       test = test + dflag; 
      } 
      else 
      { 
       dflag = (int)result; //(Int32)da.ExecuteScalar(); 
       test = test + dflag; 
      } 
     } 

     sqlConn.Close(); 
     return test; 
    } 

Этот код работает отлично, возвращает количество найденных дубликатов номеров IMEI во всех таблицах. Но я хочу знать, если SQL имеет запрос, сделать работу более оптимизируют образом или без петель

определение таблицы:

id | IMEI  | Serial | date 
---------------------------------------- 
1 3548690... 0001  15/2/15 
2 3548690... 0002  15/2/15 

данные PS [кк] - массив с именами таблиц

+0

Таблица пожалуйста! И с образцами данных и желаемым результатом это еще лучше! – jarlh

+1

с тегом mysql, но вы работаете с SqlConnection, тогда это должен быть Sql Server. – Steve

ответ

1

Вы можете отправьте один запрос на SQL-сервер вместо N запросов, где N - это номер ваших таблиц с использованием предложения UNION.

Вам нужны некоторые, как этот запрос:

SELECT SUM(C) FROM 
(
    SELECT COUNT(*) AS C FROM {Table1} WHERE IMEI = @IMEI 
    UNION 
    SELECT COUNT(*) AS C FROM {Table2} WHERE IMEI = @IMEI 
    UNION 
    . . . 
    UNION 
    SELECT COUNT(*) AS C FROM {TableN} WHERE IMEI = @IMEI 
) 

Насколько я понимаю, ваш data[] массив хранит имена таблиц.

var tableRequests = data.Select(tableName => string.Format("SELECT COUNT(*) AS C FROM [{0}] WHERE IMEI = @IMEI", tableName)); 
var innerRequest = string.Join(" UNION ", tableRequests); 
var finalRequest = string.Format("SELECT SUM(C) FROM ({0})", innerRequest); 
using (var command = new SqlCommmand(finalRequest, sqlConn)) 
{ 
    commman.Parameters.Add("@IMEI", IMEI_NUM); 
    return (int)command.ExecuteScalar(); 
} 
+0

Большое спасибо, правильный код с синтаксисом будет выглядеть следующим образом: var tableRequests = data.Select (tableName => string.Format ("SELECT COUNT (*) AS C FROM {0} WHERE (IMEI = {1})", tableName , IMEI_NUM)); var innerRequest = string.Join ("UNION", tableRequests); var finalRequest = string.Format ("SELECT SUM (C) AS EXP FROM ({0}) AS ANS", innerRequest); using (var command = new SqlCommand (finalRequest, sqlConn)) { return (int) command.ExecuteScalar(); } – Arbo

+0

привет, может ли снова помочь с строкой запроса для поиска datarow найденного значения IMEI во всех таблицах? – Arbo

+1

@Arbo Привет. Запросами таблицы являются '' SELECT * FROM [{0}] "', где '{0}' - имя таблицы. 'UNION' остается' UNION'. Конечным запросом является '' SELECT * FROM ({0}) WHERE IMEI = {1} "', где '{0}' является 'innerReqeust', а' {1} 'является желательным значением IMEI. –

0
var tableRequests = data.Select(tableName => string.Format("SELECT COUNT(*) AS C FROM {0} WHERE (IMEI = {1})", tableName, IMEI_NUM)); 
var innerRequest = string.Join(" UNION ", tableRequests); 
var finalRequest = string.Format("SELECT SUM(C) AS EXP FROM ({0}) AS ANS", innerRequest); 

     using (var command = new SqlCommand(finalRequest, sqlConn)) 
     { 
      return (int)command.ExecuteScalar(); 
     } 

благодаря @Mark Шевченко определений