我在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();
}
答案 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})";