Есть ли в DataSet функции Contain или In? - PullRequest
2 голосов
/ 05 октября 2011

Я просто хочу узнать, существуют ли какие-либо данные в базе данных.

Обычно я использую SqlDataReader, возьму цикл SqlDataReader поместил переменную в массив или список, и на бизнес-уровне снова выполните цикл по массиву или списку и сравните его с данными X, чтобы увидеть, находится ли он в списке или массиве.

 SqlDataReader readerOne = comm_SelectOne.ExecuteReader();
 while (readerOne.Read())
 { 
    ... 
 }

Я думаю, что это неэффективно, есть два цикла (на уровне доступа к данным для сбора и на бизнес-уровне для сравнения)

Есть ли другой способ сделать это с помощью DataSet?

Ответы [ 3 ]

1 голос
/ 05 октября 2011

Нет, в DataSet есть функция'nt 'In' или 'Contains', потому что DataSet сам по себе является контейнером DataTable, а данные сохраняются в DataRow, связанном с любым конкретным объектом DataTable.

Самый простой способ проверить, существуют ли данные в базе данных на нет, - написать оператор SQL Count, например, SELECT COUNT(columnName) FROM tableName WHERE columnName = 'some value'.Если «sum value» не существует в базе данных, он вернет 0, в противном случае вернет счетчик.

0 голосов
/ 06 октября 2011

я нашел в интернете ссылку на:

Стек и Поиск данных

My Bussines Layer:

 public List<string> CompareInsee(string TheZone, List<object> InseList)
    {
        try
        {
            List<string> TempDict = new List<string>();
            RempliClientInseExtracted(TheZone, ref NomTable);
            DataTable TempDS = oClInse.Get_All_Inse(NomTable);
            DataRow drFound;
            DataColumn[] dcPk = new DataColumn[1];             

            // Set Primary Key
            dcPk[0] = TempDS.Columns["NO_INSEE"];
            TempDS.PrimaryKey = dcPk;
            // Find the Row specified in txtFindArg

           foreach (var oItem in InseList)
           {
               drFound = TempDS.Rows.Find(oItem);
               if (drFound != null) TempDict.Add( oItem.ToString()); 
           }
           return TempDict;

        }
        catch (Exception excThrown)
        {
            if (!excThrown.Message.StartsWith("Err_")) { throw new Exception("Err_BL_ReadAllClientInsee", excThrown); }
            else { throw new Exception(excThrown.Message, excThrown); }
        }
    }

Уровень доступа к данным:

 public DataTable Get_All_Inse(string NomTable)
    {
        try
        {
            using (var connectionWrapper = new Connexion())
            {
                var connectedConnection = connectionWrapper.GetConnected();
                string sql_SelectAll = "SELECT * FROM " + NomTable;
                SqlCommand comm_SelectAll = new SqlCommand(sql_SelectAll, connectionWrapper.conn);

                SqlDataAdapter adapt_SelectAll = new SqlDataAdapter();
                adapt_SelectAll.SelectCommand = comm_SelectAll;
                DataTable dSet_SelectAll = new DataTable();
                adapt_SelectAll.Fill(dSet_SelectAll);
                dSet_SelectAll.Dispose();
                adapt_SelectAll.Dispose();
                return dSet_SelectAll;
            }
        }
        catch (Exception excThrown)
        {
            if (!excThrown.Message.StartsWith("Err_")) { throw new Exception("Err_GetAllUsrClient", excThrown); }
            else { throw new Exception(excThrown.Message, excThrown); }
        }
    }

Так что теперь у меня есть только 1 цикл -> только в моем слое Bussines, а не в DAL.

спасибо вам всем

0 голосов
/ 05 октября 2011

В основном DataSet является только контейнером DataTable. Если вы хотите узнать о конкретных данных в экземпляре DataTable внутри экземпляра DataSet, вы можете получить экземпляр DataTable из DataSet, и есть метод экземпляра, называемый методом «Select» (вызовите его с параметром) для запроса конкретных данных из экземпляра DataTable.

...