使用C#检查Sql中是否存在记录

时间:2014-11-24 17:03:16

标签: c# sql sql-server

在我的SQL Server数据库中,我有一些增量记录,有时我在ID增量方面有一些空白。

ID      Data     Data

9857370  Data   (null)
9857371 (null)  (null)
9857375 (null)  (null)  
9857376 (null)  (null)

我们可以看到ID增量的差距。

编辑:

我将C#与SQL一起用于ASP.net项目。 使用SQL请求,我在我的数据库中选择Last ID,在C#中选择OleDbDataReader我检查每条记录是否没有(null)(null),就像在我的例子中一样,我减少了我的ID,直到列中有数据。

但是当我在2条记录之间跳转时,我无法查看我的记录。

 ID      Data     Data

9857371  (null)  (null)
9857375  (null)  (null) 

3 个答案:

答案 0 :(得分:0)

试试这个。使用Recursive CTE生成表格中最大ID和最小ID之间的ID。然后使用LEFT join CTE with table来获取缺失的行。

DECLARE @MaxID INT = (SELECT MAX(ID) FROM Tablename)
DECLARE @MinID INT = (SELECT Min(ID) FROM Tablename)

;WITH CTE
AS (
    SELECT @MinID fullid 
    UNION ALL
    SELECT fullid + 1 FROM CTE WHERE fullid < @MaxID
    )
SELECT fullid as MissingId FROM CTE
LEFT JOIN dbo.Tablename t on t.ID = CTE.fullid 
WHERE t.ID isNULL
GO

答案 1 :(得分:0)

我通常准备好Numbers表,其中只包含一列,所有数字从1到n(n可以在必要时轻松加倍)。然后使用简单查询找到第一个未使用的数字。像:

SELECT TOP 1 NUMBER FROM NUMBERS
WHERE NOT EXISTS (SELECT * FROM TABLE1 WHERE ID = N)
ORDER BY NUMBER

简单且非常快,假设列编号和ID已编入索引。

编辑:如何创建和填充数字表。

CREATE TABLE NUMBERS(NUMBER INT)
GO
INSERT INTO NUMBERS VALUES(1)

每当需要加倍数字(1,2,4,8,......)时执行以下操作

INSERT INTO NUMBERS
SELECT (SELECT MAX(NUMBER) FROM NUMBERS) + NUMBER FROM NUMBERS

答案 2 :(得分:0)

好的,我已经解决了我的问题!

我的问题是访问数据库中的数据但是没有数据的记录(例如9857371和9857375之间)或记录空(9857376(null)(null))。

ID      Data     Data

9857370  Data   (null)
9857371 (null)  (null)
9857375 (null)  (null)  
9857376 (null)  (null)

这是我用循环访问数据的代码,希望它能帮助某人

public void main(string url)
 {
     int var = 0;
     string conn = url;


     OleDbConnection connexion = new OleDbConnection(conn);
     connexion.Open();

     OleDbCommand cmd = new OleDbCommand("SELECT ID, DATA1, DATA2 from Database WHERE ID = ( SELECT MAX (ID) -" + var + " FROM Database);", connexion);
     OleDbDataReader reader = cmd.ExecuteReader();
     reader.Read();



     if (connexion.State == ConnectionState.Open)
     {


         if (!reader.HasRows || (String.IsNullOrEmpty(reader[1].ToString())) && (String.IsNullOrEmpty(reader[2].ToString())))
         {

             reader.Close();

             OleDbDataReader reader2 = cmd.ExecuteReader();
             reader2.Read();

         Found:
             while (!reader2.HasRows || ((String.IsNullOrEmpty(reader2[1].ToString())) && (String.IsNullOrEmpty(reader2[2].ToString()))))
             {


                 var++;

                 reader2 = fonction(var, url);
                 reader2.Read();
                 if (!reader2.HasRows)
                 {
                     goto Found;
                 }
                 else if (((!String.IsNullOrEmpty(reader2[1].ToString())) || (!String.IsNullOrEmpty(reader2[2].ToString()))))
                 {

                     data = reader2[1].ToString() + " " + reader2[2].ToString();

                 }
                 else
                 {
                     data = "No Data in Database";
                 }

             }

             reader2.Close();
         }
         else
         {

             data = reader[1].ToString() + " " + reader[2].ToString();
         }

     }
     else
     {
         data = "Connexion KO";
     }



     reader.Close();
     connexion.Close();

 }