C# 在C中读取数据库时检查列是否存在#
在我的数据库中,我为对象创建了两个不同的表,比如OBJECT和ORIGINAL_OBJECT(法语,在示例中是resure),它们之间的唯一区别是ORIGINAL_OBJECT没有任何我保存修改的列 我有一个函数可以获取所有字段:C# 在C中读取数据库时检查列是否存在#,c#,mysql,C#,Mysql,在我的数据库中,我为对象创建了两个不同的表,比如OBJECT和ORIGINAL_OBJECT(法语,在示例中是resure),它们之间的唯一区别是ORIGINAL_OBJECT没有任何我保存修改的列 我有一个函数可以获取所有字段: public Repere Select_detail_repere(string query) { Repere det = null; ; if (this.OpenConnection() == t
public Repere Select_detail_repere(string query)
{
Repere det = null; ;
if (this.OpenConnection() == true)
{
IDataReader dataReader = ExecuteReader(query);
while (dataReader.Read())
{
det = new Repere();
det.Name = (dataReader["DET_NOM"] ?? string.Empty).ToString().Trim();
det.Modifies = dataReader["MODIFICATIONS"].ToString().Trim();
det.Profil = (dataReader["DET_PRF"] ?? string.Empty).ToString().Trim();
det.Matiere = (dataReader["DET_MAT"] ?? string.Empty).ToString().Trim();
det.GroupeProfil = (dataReader["DET_GRP_PRF"] ?? string.Empty).ToString().Trim();
det.Longueur = double.Parse(dataReader["LONGUEUR"].ToString().Trim());
det.Largeur = double.Parse(dataReader["DET_LARGE"].ToString().Trim());
det.Hauteur = double.Parse(dataReader["DET_HAUT"].ToString().Trim());
det.Poids = double.Parse(dataReader["DET_PDS"].ToString().Trim());
det.Angle1 = double.Parse(dataReader["ANG_AME_1"].ToString().Trim());
det.Angle2 = double.Parse(dataReader["ANG_AME_2"].ToString().Trim());
det.AngleAile1 = double.Parse(dataReader["ANG_AILE_1"].ToString().Trim());
det.AngleAile2 = double.Parse(dataReader["ANG_AILE_2"].ToString().Trim());
det.PercageString = (dataReader["PERCAGE"] ?? string.Empty).ToString().Trim();
det.ScribingString = (dataReader["SCRIBING"] ?? string.Empty).ToString().Trim();
det.Mark = (dataReader["MARK"] ?? string.Empty).ToString().Trim();
det.ContInt0 = (dataReader["CONT_INT"] ?? string.Empty).ToString().Trim();
det.ContExt0 = (dataReader["CONT_EXT"] ?? string.Empty).ToString().Trim();
det.Revision = (dataReader["REVISION"] ?? string.Empty).ToString().Trim();
}
this.CloseConnection();
}
return det;
}
我对OBJECT和OBJECT_ORIGINAL使用相同的函数。
但是,当我想读取我的OBJECT_原件时,我遇到了一个错误,该错误表示该字段不存在(显然)
我在其他情况下也遇到了同样的问题,因为只有在使用SELECT*
时,此函数才会起作用(如果我没有读取所有列,则会返回错误)
到目前为止,我发现解决这个问题的唯一方法是使用try/catch(在catch中,我将应用一个默认值,
ID=-1
),但我觉得这不是一个非常正确的解决方案,我正在寻找另一种方法来解决这个问题。如果使用COL\u-LENGTH,那么作为您使用的查询进行查询会很有帮助,但我认为您可以使用('table_name','column_name')在查询中不为空。
。您可以使用mysql存储过程并对其进行内部检查。
在这里检查一下。
您需要检查datareader中是否存在列
修改
,因为您在正手时不知道
在Microsoft的应用程序中,我发现了一个名为的方法。它将为您提供一个描述列元数据的datatable。因此,您可以检查该表以查看是否有名为
MODIFICATIONS
我会用另一种方法进行检查,这样就不会在循环时把
中的代码弄乱
或
您可以在StackOverflow上查看此问题,该问题的解决方案较短。
我认为这是一个更好、更简单的解决方案,但在我几乎完成了上面的回答之后,我(通过简单的谷歌搜索)找到了它。这就是为什么我给你两种解决方案(同时也是为了帮助你一点MS文档,我在评论中指出了这一点)这个问题可以用“重复”来引用,我在上找到了答案
public resume选择\u细节\u resume(字符串查询)
{
repre-det=null;
if(this.OpenConnection()==true)
{
IDataReader dataReader=ExecuteReader(查询);
bool containsModification=CheckIfDataContains(数据读取器,“修改”);
while(dataReader.Read())
{
det=新的曲目();
det.Name=(dataReader[“det_NOM”]??string.Empty).ToString().Trim();
if(包含修改)
{
det.Modifies=dataReader[“MODIFICATIONS”].ToString().Trim();
}
其他的
{
det.Modifies=“”;
}
det.Profil=(数据读取器[“det_PRF”]??string.Empty).ToString().Trim();
det.Matiere=(数据读取器[“det_MAT”]??string.Empty).ToString().Trim();
...
}
这个.CloseConnection();
}
返回数据;
}
public bool CheckIfDataContains(IDataReader数据读取器,字符串列名)
{
对于(int i=0;i
我已经看到了,这不是我想要的,他在那篇帖子上说的是,如果列不存在,就创建列,我不想碰它。啊,很抱歉没有理解它。它安静敏感的数据库操作ehh..查询非常简单:从表1中选择*将起作用,从表2中选择*将不起作用“修改”不存在。我不需要在查询中设置条件,但当我阅读结果时,您是否阅读了IDataReader
的MSDN文档?只是现在做了,但没有帮助…好的,我想我理解了。使用堆栈链接中给出的方法,我启动了方法“HasColumn”(当然只有一次),然后一个ifelse将解决问题。关于堆栈链接,我无法理解它是如何工作的。但是,多亏了你,我找到了GetSchemaTable的链接,然后是DataColumnCollection,我想我找到了一些东西,它不是“短”的“正如我所预料的,但这让我很开心,谢谢你。你不用for
循环,而是用contains
方法遍历所有列。你可以通过返回列来缩短方法。contains(columnName)
而不是if
语句,但这正是您喜欢的。谢谢,事实上,返回列。Contains(columnName)更好,只是编辑了一下,谢谢您的反馈。附言:您如何将注释“灰”掉?您可以使用反勾号,请参阅有关格式的帮助。只是“未接受”回答,因为我现在才注意到代码不起作用,事实上{columns.Contains(columnName)}返回的总是falseContains
可能区分大小写。还要确保列名不重复,它将返回false。请参阅Microsoft文档
public Repere Select_detail_repere(string query)
{
Repere det = null; ;
if (this.OpenConnection() == true)
{
IDataReader dataReader = ExecuteReader(query);
bool containsModification = CheckIfDataContains(dataReader, "MODIFICATIONS");
while (dataReader.Read())
{
det = new Repere();
det.Name = (dataReader["DET_NOM"] ?? string.Empty).ToString().Trim();
if(containsModification)
{
det.Modifies = dataReader["MODIFICATIONS"].ToString().Trim();
}
else
{
det.Modifies = "";
}
det.Profil = (dataReader["DET_PRF"] ?? string.Empty).ToString().Trim();
det.Matiere = (dataReader["DET_MAT"] ?? string.Empty).ToString().Trim();
...
}
this.CloseConnection();
}
return det;
}
public bool CheckIfDataContains(IDataReader dataReader,string columnName)
{
for (int i = 0; i < dataReader.FieldCount; i++)
{
if (dataReader.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
return true;
}
return false;
}