Check if table exists with if statement in C#?

2019-06-21 19:47发布

问题:

I try to put up an if statement to check if a table is already created. I only want to create one table, but as it is now I create a table every time I click the button to store the info. Any suggestions?

    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];

    }

I try to get out the info stored in the XLM with a DataGridView named lagredeGjester as seen over.

UPDATED QUESTION :

Now I wrote the code like this :

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

        }

    }

On my first run I entered two different infomations and pressed my button. Both info got in the same table as I wanted it to. But I can't seem to write my if statement correctly. When I run the code above it works with an empty XML (with no tables), but as long as "Gjester" table is created it says "A DataTable named 'Gjester' already belongs to this DataSet." But isn't this what my if statement should prevent? As I wrote it now, should it not just add the info and not try to create a new table?

回答1:

Can Check via:

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

OR

 if(dt.Rows.Count == 0)

OR

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");
}


回答2:

A possible solution would be to define the DataSet out of the function. Then check number of tables in the dataset.

DataSet ds = new DataSet();

private void InitDataTable()
{
    DataTable dt;

    if(ds.Tables.Count > 0 )
    {
        dt = ds.Tables[0];
    }

    dt = new DataTable();

    //your code
}


回答3:

You can also Extend DataSet to add a method 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;          
  }