【问题标题】:App doesn't run it crashed directly after I started it应用程序不运行它在我启动后直接崩溃
【发布时间】:2017-10-20 00:09:36
【问题描述】:

我有一个问题,这是我的代码:

DataTable DT1 = new DataTable();

public static DataTable DATASETRETURN(string queryString)
{
    DataSet DS = new DataSet();

    SqlDataAdapter adapter = new SqlDataAdapter
            {
                SelectCommand = new SqlCommand(queryString, CLSERVICES.CON)
            };
    adapter.Fill(DS, "TABLE");

    return DS.Tables["TABLE"];
}

private void FE_C_HISTORIQUE_Load(object sender, EventArgs e)
{
    E_HISTORIQUE_LV_HISTORIQUE_04.Items.Clear();
    string req = "select H.NHistorique, P.Intitulle, H.QuantiteVendu, P.PrixVente,"+
                 "(P.PrixVente * H.QuantiteVendu) as PQ, H.TypeAction, H.DateAction " +
                 "from HISTORIQUE as H, PRODUIT as P" +
                 "where (P.NProduit = H.NProduit)"+
                 "order by H.NHistorique desc";
    DT1 = DATASETRETURN(req);

    for (int i = 0; i < DT1.Rows.Count; i++)
    {
        ListViewItem LV = new ListViewItem(DT2.Rows[i][0].ToString());
        LV.SubItems.Add(DT1.Rows[i][1].ToString());
        LV.SubItems.Add(DT1.Rows[i][2].ToString());
        LV.SubItems.Add(DT1.Rows[i][3].ToString());
        LV.SubItems.Add(DT1.Rows[i][4].ToString());
        LV.SubItems.Add(DT1.Rows[i][5].ToString());
        LV.SubItems.Add(DT1.Rows[i][6].ToString());

        E_HISTORIQUE_LV_HISTORIQUE_04.Items.Add(LV);
    }
} 

运行应用程序后,我在方法DATASETRETURN 中遇到错误

adapter.Fill(DS, "TABLE");

错误是:

System.Data.SqlClient.SqlException "\"P\" 不是可识别的表提示选项。如果它打算作为表值函数或 CHANGETABLE 函数的参数,请确保您的数据库兼容模式设置为 90。"

有什么解决办法吗?

【问题讨论】:

  • 您在某些 sql 字符串的末尾缺少空格。例如,“...PRODUIT as Pwhere(P.NProduit...”。
  • 在调试器中在DT1 = DATASETRETURN 处设置断点并查看req 包含的内容。
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 年前),不鼓励使用它
  • 感谢@Gaber-be 给了我问题的来源。
  • 谢谢@dourHighArch,下次我会试试的:)

标签: c# sql sql-server ado.net


【解决方案1】:

“P_where”和“H.NProduit)_order”之间缺少空格引起的问题

在指定多行查询时我更喜欢:

string req = @"
  select H.NHistorique,P.Intitulle,H.QuantiteVendu,P.PrixVente,
   (P.PrixVente*H.QuantiteVendu)as PQ,H.TypeAction,H.DateAction
  from HISTORIQUE as H, PRODUIT as P
  where(P.NProduit = H.NProduit)
  order by H.NHistorique  desc
";

这样可以减少查询中丢失新行的机会。

【讨论】:

  • 好的,谢谢,现在我知道一个新问题的解决方案非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多