如何在没有循环的情况下在一次迭代中检索所有grdiview列值?

时间:2016-04-16 04:16:35

标签: c# asp.net gridview

我在asp.net c#中以编程方式创建表时遇到问题。我正在研究sql项目。我有一个gridview和一个按钮,当我点击按钮然后我想要所有gridview列值,例如 column_name,data type,allowNull,PrimaryKey etc

所有值都插入"创建表QUERY"在一次迭代和表中将创建,但我有一个问题。我在循环第一次执行时使用for循环,然后只有一行迭代,而在SQL中创建的表只有一列(只是第一行),当第二次迭代执行时,表名将相同,所以存在问题。 / p>

请告诉我如何解决此问题。所有值都已成功插入表中,但问题在于创建表。表已创建,但“只有最后”#39;创建了行表,表只包含一行。如何解决此问题。

我该怎么做?

这是我的"按钮"代码aspx.cs`

public void insert(object sender, EventArgs e)
 {
   SqlConnection cnn = new SqlConnection("Data Source=HAMEED_KHAN\\SQLEXPRESS;Initial Catalog=db_compiler;Integrated Security=True");
    string d=Session["value"].ToString();
    SqlCommand cmd2=new SqlCommand("SELECT Database_id FROM Create_db WHERE Database_Name='"+d+"'",cnn);
    cnn.Open(); 
    string dbid = cmd2.ExecuteScalar().ToString();
    cnn.Close();
    int D_ID = Int32.Parse(dbid);
    string str = "";
    string type = "";
    for (int i = 0; i < GridView2.Rows.Count; i++)
    {
        string tblname = "abc";
        str=GridView2.Rows[i].Cells[1].Text.ToString();
        type=GridView2.Rows[i].Cells[2].Text.ToString();
        string Name = GridView2.Rows[i].Cells[1].Text.ToString();
        string Type = GridView2.Rows[i].Cells[2].Text.ToString();
        CheckBox allow=GridView2.Rows[i].Cells[3].Controls[0]as CheckBox;
        CheckBox primary = GridView2.Rows[i].Cells[4].Controls[0] as CheckBox;
        string s = Session["UID"].ToString();
      int id = Int32.Parse(s);
        string date = DateTime.Now.ToString();
        string A = (allow.Checked == true ? "NULL" : "NOT NULL");
        string P = (primary.Checked == true ? "PRIMARY KEY" : "");
       // string query="USE "+d+" CREATE TABLE ABCD ("+Name+" "+Type+" "+A+")";
      //  SqlCommand cmd3 = new SqlCommand(query, cnn);
        SqlCommand cmd = new SqlCommand("insertTbl", cnn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Name", tblname);
        cmd.Parameters.AddWithValue("@col_name", Name);
        cmd.Parameters.AddWithValue("@dtype",Type);
        cmd.Parameters.AddWithValue("@dbId", D_ID);
        cmd.Parameters.AddWithValue("@allow",(allow.Checked==true ? "true" : "false"));
        cmd.Parameters.AddWithValue("@primary", (primary.Checked == true ? "true" : "false"));
        cmd.Parameters.AddWithValue("@user", id);
        cmd.Parameters.AddWithValue("@date", date);
        SqlDataAdapter ad = new SqlDataAdapter(cmd);
        cnn.Open();
        cmd.ExecuteNonQuery();
       // cmd3.ExecuteNonQuery();
        cnn.Close();
    }
    string str1=str;
    string str2=type;
    //string AA="ALLOW NULL";
   // string queryy =string.Format(@"USE {"+d+"}; IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA = 'dbo' AND  TABLE NAME = 'ABCDE'))CREATE TABLE ABCDE ({"+str1+"} {"+type+"} {"+AA+"})");
    string queryy="USE "+d+" If not exists (select name from sysobjects where name = 'Customers') CREATE TABLE Customers("+str1+" "+type+")";
    SqlCommand cmd4 = new SqlCommand(queryy, cnn);
    cnn.Open();
    cmd4.ExecuteNonQuery();
    cnn.Close();
  }

1 个答案:

答案 0 :(得分:0)

您应该确保避免使用可重新运行的脚本重新创建同一个表。对于CREATE TABLE,检查它的存在是this way

string query = String.Format(@"
USE {0}; 
IF (NOT EXISTS (SELECT * 
                FROM INFORMATION_SCHEMA.TABLES 
                WHERE TABLE_SCHEMA = 'dbo' 
                 AND  TABLE_NAME = '{1}'))
    CREATE TABLE {1} ({2} {3} {4})", d, "ABCD", Name, Type, A);

请注意,我使用String.Format来提高可读性并避免字符串连接(字符串是不可变的,因此在使用+运算符时会创建很多实例)。

但是,如果您打算创建一次并插入多次,请考虑将您的CREATE TABLE移出for循环。无论如何,应该进行存在检查。

从C#6.0开始,你可以使用逐字和插值(实际上,在6.0中引入了字符串插值)。像这样:

string query = $@"
USE {d}; 
IF (NOT EXISTS (SELECT * 
                FROM INFORMATION_SCHEMA.TABLES 
                WHERE TABLE_SCHEMA = 'dbo' 
                 AND  TABLE_NAME = 'ABCD'))
    CREATE TABLE ABCD ({Name} {Type} {A})";