在C#中使用if语句检查表是否存在?

10

我尝试使用 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”表格被创建,它就会显示“DataTable 名为 'Gjester' 已经属于此 DataSet。”但这不是我的 if 语句应该避免的吗?按照我现在的编写方式,它不应该只添加信息而不尝试创建新表格吗?

3个回答

15

可以通过以下方式进行检查:

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”。 - Praise
如果(ds.Tables["tablename"]) { // 执行某些操作 } - Praise
我刚刚运行它,得到了“NullReferenceException未处理。对象引用未设置为对象的实例。” - Praise
现在我似乎只是得到了“表不存在”的错误。因此,我将标志设置为1。 - Praise
不,它没有创建我想要存储在XML中的信息。看一下我编辑过的问题。我在那里发布了我所做的事情。 - Praise
为ds.Tables.Contains("tablename") 投一票,这样我们就可以检查表名而不是确切的表编号。 - Sijav

4
你可以扩展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;          
  }

请解释得更详细一些,我是把这个方法放在函数里面吗?然后呢? - Praise
不需要,一旦您在代码中的其他位置添加了FetchOrCreate扩展方法,而不是将datatable dt存储为变量,请将Dataset ds作为变量进行存储,然后在初始化变量ds的位置使用此FetchOrCreate。... var myds = ds.FetchorCreate(“TableName”)。然后FetchorCreate()方法将返回现有数据集或为您创建一个新数据集。 - Charles Bretana

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]? - Praise
如果数据集具有数据表,则不会创建新表。它将使用现有的表。 - Hossein Narimani Rad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接