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

z8dt9xmd  于 2021-06-18  发布在  Mysql
关注(0)|答案(4)|浏览(329)

在我的数据库中,我为对象创建了两个不同的表,比如object和original\u object(在法语中,在示例中是restree),它们之间的唯一区别是original\u 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使用相同的函数。但是当我想读取我的object\u original时,我遇到了一个错误,它说这个字段不存在(很明显)。
我在其他情况下也遇到了同样的问题,因为只有使用 SELECT * (如果我没有读取所有列,这将返回一个错误)。
到目前为止,我发现解决这个问题的唯一方法是使用try/catch(在catch中我将应用一个默认值, ID=-1 例如),但我觉得这不是一个非常正确的解决方案,正在寻找另一种方法来实现这一点。

wr98u20j

wr98u20j1#

这个问题可以引用为“重复”,我在堆栈上找到了答案

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;
    }
lpwwtiir

lpwwtiir2#

这将是有帮助的,因为你使用的查询以及,但我认为你可以使用 IF COL_LENGTH('table_name','column_name') IS NOT NULL 在您的查询中。

g6baxovj

g6baxovj3#

你需要检查一下 MODIFICATIONS 存在于数据读取器中,因为你不知道它在正手。
在微软的文档中,我发现了一个名为 GetSchemaTable .
它将为您提供一个描述列元数据的datatable。所以您可以检查该表以查看是否有名为的列 MODIFICATIONS .
我会把这个检查放在一个不同的方法中,这样就不会把代码弄乱 while 循环那么多。

您可以在stackoverflow检查sqldatareader对象中的列名时检查这个问题,该对象对您的问题有一个较短的解决方案。
我认为这是一个更好更简单的解决方案,但我发现它(通过一个简单的谷歌搜索)后,我几乎完成了我的答案上面。所以这就是为什么我给你们两个解决方案(同时也帮助你们一点ms文档,我在评论中指出)

pgpifvop

pgpifvop4#

您可以使用mysql存储过程并对其进行内部检查。在这里检查一下。检查alter table--mysql之前是否存在列

相关问题