c# - 从另一个表动态创建列
问题描述
我正在使用 TSQL 和 C#。我有两个返回字符串的查询:
string[] allSubcategories = dt.AsEnumerable().Select(x => x.Field<string>("SubcategoryName")).Distinct().ToArray();
var redMark = db.GetTableBySQL("SELECT * FROM RedMarkItems");
string[] redMarkColumns = redMark.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToArray();
所以,你可以看到我有两个不同的数组,首先我得到 subcategoriesNames:
以及表 RedMarkItems 的所有列:
我想做的是动态创建列,我的意思是,如果 subcategorieName 作为 RedMarkItems 中的列不存在,请执行更新并创建它,例如:
var createColumn = db.ExeSQL($"ALTER TABLE RedMarkItems ADD {ColumnName} BIT");
如果 subcategorieName 不作为 RedMarkItems 表中的列存在,我该如何比较?然后创建列作为我的查询?问候
解决方案
如果您想知道使用 Linq 方法在已填充的 DataTable 中是否存在特定列,那么它只是:
bool exists = redMark.Columns.Cast<DataColumn>().Any(x => x.ColumnName == "SubCategoryName");
相反,如果您想直接向数据库询问此信息,请使用INFORMATION_SCHEMA视图 Columns 视图是用于此类查询的视图。
string query = @"IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.Column
WHERE Column_Name = @colName)
SELECT 1 ELSE SELECT 0";
SqlCommand cmd = new SqlCommand(query, connection);
cmd.Parameters.Add("@colName", SqlDbType.NVarChar).Value = "SubCategoryName";
bool exists = (cmd.ExecuteScalar() == 1);
现在,关于创建列的部分本身就像代码一样简单。它只是一个适当的 ALTER TABLE。但是之前有很多事情要弄清楚。新列的数据类型是什么?它的长度和精度是多少?应用到它的约束是什么(Null/Not Null 默认值等)?正如您所看到的,所有这些信息都非常重要,需要在代码中的某个位置进行定义。
推荐阅读
- ffmpeg - FFmpeg 缩放和 concat 与动态高度
- php - 获取具有用户标签的帖子
- node.js - 在测试Nodejs Express App期间可以使用的内存数据库
- java - 如何在 Java 中使用 split() 字符串方法分隔单词
- java - 无法向 Java 中经过身份验证的 Hyperledger Composer 休息服务器发出发布请求
- javascript - 返回与 jQuery 连接的动态字符串
- dynamics-crm - Dynamics 365 - 确保所有任务均已完成的检查
- java - 尝试在 Unity3d 中构建 Android 版本时遇到问题
- angular - 从数组中删除关键对象 - Angular 5
- ios - 如何使用自动布局(约束)将子视图添加到 UIPageViewController?