2014-11-24 74 views
0

在我的SQL Server数据库中,我有记录是递增的,有时我在ID增量中有一些空白。检查Sql中是否存在一条记录C#

ID  Data  Data 

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

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

编辑:

我使用C#与SQL为一个ASP.net项目。 对于SQL请求,我选择数据库中的Last ID和OleDbDataReader中的C#我检查每条记录,如果他没有(null)(null),就像我的示例中那样,我递减我的ID直到在列中有一个Data 。

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

ID  Data  Data 

9857371 (null) (null) 
9857375 (null) (null) 
+0

'选择从yourtable COUNT(*),其中id = $ id',基本上看计数返回为。 0 =没有匹配的行。 – 2014-11-24 17:05:30

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2014-11-24 17:05:49

+0

什么问题?看看第一条评论。这非常简单。或者你正在提出worng问题。如果是,请编辑它。 – JotaBe 2014-11-24 17:08:48

回答

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(); 

} 
0

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

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 
+0

从性能角度来看,使用rCTE进行计数确实很差。它的工作原理,但它仍然在逐行逻辑。 http://www.sqlservercentral.com/articles/T-SQL/74118/ – 2014-11-24 17:25:16

0

我通常具有Numbers表格准备好,其中只包括一个塔和所有从1到n的数字(n可以被容易地加倍需要时)。然后使用简单的查询来查找第一个未使用的数字。如:

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

简单而且速度很快,假设列数和索引都是索引的。

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

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 
相关问题