【问题标题】:Check if table exists with if statement in C#?用C#中的if语句检查表是否存在?
【发布时间】:2013-04-15 07:37:00
【问题描述】:

我尝试使用 if 语句来检查表是否已经创建。我只想创建一个表,但现在我每次单击按钮来存储信息时都会创建一个表。有什么建议?

    DataTable dt;

    private void InitDataTable()
    {

        if () { 

        }

        dt = new DataTable();
        DataSet ds = new DataSet();
        ds.ReadXml("gjesteInfo.xml");
        ds.Tables.Add(dt);

        DataColumn dc1 = new DataColumn("Fullt navn");
        DataColumn dc2 = new DataColumn("Start dato");
        DataColumn dc3 = new DataColumn("Antall dager");

        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);

        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);

        ds.Merge(dt);

        ds.WriteXml("gjesteInfo.xml");

    }



    private void lagre_Click(object sender, EventArgs e)
    {

        InitDataTable();

        gjesterutenrom.Items.Add(gjestenavnInput.Text);

        gjestenavnInput.Text = "";
        datoInnsjekk.Text = "";
        antallDager.Text = "";

        DataSet onClick = new DataSet();
        onClick.ReadXml("gjesteInfo.xml");
        lagredeGjester.DataSource = onClick.Tables[0];

    }

我尝试使用一个名为 lagredeGjester 的 DataGridView 取出存储在 XLM 中的信息,如图所示。

更新问题:

现在我写了这样的代码:

    DataTable dt;

    DataSet ds = new DataSet();

    private void InitDataTable()
    {


         if( ds.Tables.Contains("Gjester")   )
        {
            dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
            ds.Merge(dt);

            ds.WriteXml("gjesteInfo.xml");

        }
        else {

            dt = new DataTable("Gjester");

            ds.ReadXml("gjesteInfo.xml");
            ds.Tables.Add(dt);

            DataColumn dc1 = new DataColumn("Fullt navn");
            DataColumn dc2 = new DataColumn("Start dato");
            DataColumn dc3 = new DataColumn("Antall dager");

            dt.Columns.Add(dc1);
            dt.Columns.Add(dc2);
            dt.Columns.Add(dc3);

            dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
            ds.Merge(dt);

            ds.WriteXml("gjesteInfo.xml");

        }

    }

在我第一次跑步时,我输入了两个不同的信息并按下了我的按钮。这两个信息都按我的意愿放在同一张桌子上。但我似乎无法正确编写我的 if 语句。当我运行上面的代码时,它使用一个空的 XML(没有表),但只要创建了“Gjester”表,它就会显示“一个名为 'Gjester' 的数据表已经属于这个数据集”。但这不是我的 if 语句应该防止的吗?正如我现在写的那样,它不应该只是添加信息而不是尝试创建一个新表吗?

【问题讨论】:

    标签: c# datagridview datatable exists readxml


    【解决方案1】:

    您还可以扩展 DataSet 以添加方法 FetchOrCreate()

      public static DataTable FetchOrCreate(this DataSet ds, string tableName)
      {
           if (ds.Tables.Contains(tableName)) 
               return ds.Tables[tableName];
           // -------------------------------
           var dt = new Datatable(tableName);
           ds.Tables.Add(dt);
           return dt;          
      }
    

    【讨论】:

    • 请多解释一下,我把这个方法放在函数里面吗?然后呢?
    • 不,一旦你在其他地方添加了 FetchOrCreate 扩展方法,在你的代码中而不是将数据表 dt 存储为变量,存储数据集 ds,然后在你将初始化变量 ds 的位置,使用这个 FetchOrCreate 代替.... var myds = ds.FetchorCreate("TableName").然后 FetchorCreate() 方法将返回现有数据集或为您创建一个新数据集。
    【解决方案2】:

    可以通过以下方式检查:

    if(ds.Tables.Contains("tablename"))
    

     if(dt.Rows.Count == 0)
    

    int flag=0;
    try
    {
    
        if(ds.Tables["tablename"].Rows.Count>0)
        {
          // execute something
        }
    }
    catch(Exception ex)
    {
     flag=1;
    }
    
    if(flag==1)
    {
      messagebox.show("Table does not exists");
    }
    

    【讨论】:

    • 我试过你最后的建议,但我得到的只是“无法将类型 System.Data.DataTable 隐式转换为 Bool”
    • if(ds.Tables["tablename"]) { // 执行某事 }
    • 我刚刚运行它并得到“NullReferenceException 未处理。对象引用未设置为对象的实例。”
    • 现在我似乎得到了 Table 不存在。所以我将标志设置为 1。
    • 没有。它不会创建我想要存储在 XML 中的信息。看看我编辑的问题。我发布了我在那里所做的事情。
    【解决方案3】:

    一个可能的解决方案是在函数之外定义DataSet。然后检查数据集中的表数。

    DataSet ds = new DataSet();
    
    private void InitDataTable()
    {
        DataTable dt;
    
        if(ds.Tables.Count > 0 )
        {
            dt = ds.Tables[0];
        }
    
        dt = new DataTable();
    
        //your code
    }
    

    【讨论】:

    • 我仍然创建了一个新表。为什么 dt = ds.Tables[0]?
    • @MariusMathisen 如果数据集有数据表,则不会创建新表。它使用现有的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多