如何在 SQL 中使用 C# 创建列

Posted

技术标签:

【中文标题】如何在 SQL 中使用 C# 创建列【英文标题】:How create columns with C# in SQL 【发布时间】:2021-12-12 20:16:53 【问题描述】:

我想提出申请。我希望代码在表格中创建与我在文本框中键入的列数一样多的列。我在应用程序中的主要目的是编写一个标题(如表格)并添加尽可能多的字幕(列)。但我只能通过结合系统代码来添加列。我只能通过更改下面的代码来添加列,但我想要的是在表单上创建一个文本框并添加与那里写的数字一样多的列。

`private void button1_Click(object sender, EventArgs e)
        
            string s1, s2;
            s1 = textBox2.Text;
            s2 = "char(20)"; 
            try
            
                baglanti.Open();
                SqlCommand komut = new SqlCommand("Create Table " + textBox1.Text + " ( " + s1 + " " + s2 + " ) ", baglanti);
                komut.ExecuteNonQuery();
                baglanti.Close();
                MessageBox.Show("Succes");
            
            catch (Exception)
            
                MessageBox.Show("Error");
            
        
`

【问题讨论】:

那么您的问题是什么?虽然这里真正的 问题是代码中存在巨大的安全漏洞。您正在将未经处理的值注入您的 RDBMS。 不想刻薄,但您确定您不是只是在寻找 Excel 工作簿,或者可能是 NoSQL 文档存储? RDBMS 系统不能很好地处理任意表结构,安全地构建动态 SQL 是一种痛苦。 如果有人输入t(i int); CREATE LOGIN NewSA WITH PASSWORD = 'a', CHECK_POLICY = OFF; ALTER SERVER ROLE sysadmin ADD MEMBER NewSA;-- 作为他们的表的“名称”,你认为会发生什么? 要实现这一点,您必须将 sqlstatement 字符串写入 for 循环中,该循环的迭代次数与文本框中的数字一样多。这应该很简单,所以不清楚你到底卡在哪里。我同意其他人的观点 1) 这感觉像是解决你不应该遇到的问题的解决方案(很少有充分的理由来动态处理数据库对象) 2) 即使写得很好,这也可能会引发 sql 注入攻击洞。 那么,您正在重新发明 SSMS? 【参考方案1】:

有更好的方法。而不是动态添加列和表,您可能有许多个遵循这种格式的表:

用户创建的表 1

Title SubTitle1 SubTitle2 ... SubTitleN
data for first table ...

用户创建的表 2

Title SubTitle1 SubTitle2 ... SubTitleX
data for second table ...

您应该总共使用两个表,其中架构几乎永远不会改变,如下所示:

单基表

ID TableName Title
1 ... ...
2 ... ...

字幕

ID TableID SubTitle
1 1 ...
2 1 ...
N 1 ...
N+1 2 ...
N+2 2 ...
N+X 2 ...

SubTitles 表中,第一个ID 字段是为了确保表内的唯一性并允许引用特定的字幕,第二个TableID 字段是关联回第一个表中的正确记录。两者都需要。

【讨论】:

谢谢。我按照你说的做了,但是在第二个表中添加 subTitles 时,我不能向同一个 ID 添加多个标题。我在 SQL 中将数据库中的 ID 和表 ID 组合在一起。错误文本 = System.Data.SqlClient.SqlException:'违反主键约束'PK_ProjeUnsurları'。无法在对象“dbo.ProjeUnsurları”中插入重复键。重复键值为 (11)。声明已终止。' I combined the ID and Table ID in the database in SQL. 这正是你应该做的事情。我在这个答案中使用了两个单独的字段是有原因的。 SubTitle 表中的每条记录都需要它自己的唯一 ID,并且 需要对父 TableID 的引用。我更新了答案来解释这一点。

以上是关于如何在 SQL 中使用 C# 创建列的主要内容,如果未能解决你的问题,请参考以下文章

如何对两列求和并通过减去它们的聚合 SQL 和 C# 在第三列中显示结果?

如何使用 SqlCommand 和 DataAdapter 以使用 C# 操作 SQL Server

从 C# 检索 SQL Server 扩展属性

如何将多个 SQL 数据列存储到不同的变量 C#

如何使用 Oracle 和 SQL Server 将 .NET 4.5 C# Entity Framework 6 中的列映射为大写?

如何在 C# 中从 SQL Server 数据库中检索数据?