Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中读取数据库时检查列是否存在#_C#_Mysql - Fatal编程技术网

C# 在C中读取数据库时检查列是否存在#

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

在我的数据库中,我为对象创建了两个不同的表,比如OBJECT和ORIGINAL_OBJECT(法语,在示例中是resure),它们之间的唯一区别是ORIGINAL_OBJECT没有任何我保存修改的列

我有一个函数可以获取所有字段:

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)}返回的总是false
Contains
可能区分大小写。还要确保列名不重复,它将返回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;
    }