【问题标题】:c# execute large SQL statement [closed]c#执行大型SQL语句[关闭]
【发布时间】:2014-01-30 19:07:17
【问题描述】:

我有一个大型 SQL 语句,我想在 c# 中运行,但是,我看到的所有示例都是针对一行长度的 SQL 语句。

到目前为止,这是我的 C# 代码。在我的代码之后,我已经包含了查询,我想运行。


C# 查询代码
private void button4_Click(object sender, EventArgs e)
        {
           System.Data.Odbc.OdbcConnection conn = new System.Data.Odbc.OdbcConnection();
           conn.ConnectionString = "Driver={Oracle in OraClient11g_home1};" +
                                   "Dbq=" + "database" +
                                   ";Uid=" + "admin" + ";Pwd=" + "admin" + ";";
           try
           {
               conn.Open();
               OdbcCommand com = new OdbcCommand("select count(*) from user_tables;", conn);
               com.CommandType = CommandType.Text;
               OdbcDataReader rdr = com.ExecuteReader();
               while (rdr.Read())
               {
                   var mystring = rdr.GetString(0);
                   MessageBox.Show(mystring);
               }                
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message); 
           }
           conn.Close();
        }


要运行的查询
SELECT user_id,
         user_name,
         user_name_full,
         (SELECT user_name
            FROM MD_SITE_USER
           WHERE user_id = u.GROUP_ID)
            assigned_user_group,
         user_or_group,
         CASE
            WHEN (SELECT o.grant_or_revoke
                    FROM MD_SITE_APP_ACTION a, MD_SITE_APP_ACTION_OWNER o
                   WHERE     a.action_id = o.action_id
                         AND a.action_name = 'Admin.start'
                         AND o.user_id = u.GROUP_ID) = '+'
            THEN
               'Y'
            ELSE
               'N'
         END
            "Assigned By Group?",
         CASE
            WHEN (SELECT o.grant_or_revoke
                    FROM MD_SITE_APP_ACTION a, MD_SITE_APP_ACTION_OWNER o
                   WHERE     a.action_id = o.action_id
                         AND a.action_name = 'Admin.start'
                         AND o.user_id = u.user_id) = '+'
            THEN
               'Y'
            ELSE
               'N'
         END
            "Assigned By User?"
    FROM MD_SITE_USER u
   WHERE     user_name IS NOT NULL
         AND (   CASE
                    WHEN (SELECT o.grant_or_revoke
                            FROM MD_SITE_APP_ACTION a,
                                 MD_SITE_APP_ACTION_OWNER o
                           WHERE     a.action_id = o.action_id
                                 AND a.action_name = 'Admin.start'
                                 AND o.user_id = u.GROUP_ID) = '+'
                    THEN
                       'Y'
                    ELSE
                       'N'
                 END = 'Y'
              OR CASE
                    WHEN (SELECT o.grant_or_revoke
                            FROM MD_SITE_APP_ACTION a,
                                 MD_SITE_APP_ACTION_OWNER o
                           WHERE     a.action_id = o.action_id
                                 AND a.action_name = 'Admin.start'
                                 AND o.user_id = u.user_id) = '+'
                    THEN
                       'Y'
                    ELSE
                       'N'
                 END = 'Y')
ORDER BY user_or_group, user_name;

【问题讨论】:

  • 写成一行,或者使用StringBuilder
  • 你是问如何运行这么长的代码吗?您可以在一个过程中创建它并执行该过程。
  • 使它成为一个存储过程。为什么需要运行所有这些内联 sql 代码,看起来很可怕!

标签: c# sql oracle


【解决方案1】:

这样做...或者使用 StringBuilder 类...

    new OdbcCommand(@"SELECT user_id,
         user_name,
         user_name_full,
         (SELECT user_name
            FROM MD_SITE_USER
           WHERE user_id = u.GROUP_ID)
            assigned_user_group,
         user_or_group,
         CASE
            WHEN (SELECT o.grant_or_revoke
                    FROM MD_SITE_APP_ACTION a, MD_SITE_APP_ACTION_OWNER o
                   WHERE     a.action_id = o.action_id
                         AND a.action_name = 'Admin.start'
                         AND o.user_id = u.GROUP_ID) = '+'
            THEN
               'Y'
            ELSE
               'N'
         END
            'Assigned By Group?',
         CASE
            WHEN (SELECT o.grant_or_revoke
                    FROM MD_SITE_APP_ACTION a, MD_SITE_APP_ACTION_OWNER o
                   WHERE     a.action_id = o.action_id
                         AND a.action_name = 'Admin.start'
                         AND o.user_id = u.user_id) = '+'
            THEN
               'Y'
            ELSE
               'N'
         END
            'Assigned By User?'
    FROM MD_SITE_USER u
   WHERE     user_name IS NOT NULL
         AND (   CASE
                    WHEN (SELECT o.grant_or_revoke
                            FROM MD_SITE_APP_ACTION a,
                                 MD_SITE_APP_ACTION_OWNER o
                           WHERE     a.action_id = o.action_id
                                 AND a.action_name = 'Admin.start'
                                 AND o.user_id = u.GROUP_ID) = '+'
                    THEN
                       'Y'
                    ELSE
                       'N'
                 END = 'Y'
              OR CASE
                    WHEN (SELECT o.grant_or_revoke
                            FROM MD_SITE_APP_ACTION a,
                                 MD_SITE_APP_ACTION_OWNER o
                           WHERE     a.action_id = o.action_id
                                 AND a.action_name = 'Admin.start'
                                 AND o.user_id = u.user_id) = '+'
                    THEN
                       'Y'
                    ELSE
                       'N'
                 END = 'Y')
ORDER BY user_or_group, user_name;", conn);

【讨论】:

    【解决方案2】:

    您可以通过@ 符号使用string literal

    string longstring = @"SELECT
            *
        FROM MyTable
      ";
    

    请注意,在您的情况下,您的查询中有 "。要逃避这些,请将它们替换为 ""

    string myQuery = @"SELECT user_id,
         user_name,
         user_name_full,
         (SELECT user_name
            FROM MD_SITE_USER
           WHERE user_id = u.GROUP_ID)
            assigned_user_group,
         user_or_group,
         CASE
            WHEN (SELECT o.grant_or_revoke
                    FROM MD_SITE_APP_ACTION a, MD_SITE_APP_ACTION_OWNER o
                   WHERE     a.action_id = o.action_id
                         AND a.action_name = 'Admin.start'
                         AND o.user_id = u.GROUP_ID) = '+'
            THEN
               'Y'
            ELSE
               'N'
         END
            ""Assigned By Group?"",
         CASE
            WHEN (SELECT o.grant_or_revoke
                    FROM MD_SITE_APP_ACTION a, MD_SITE_APP_ACTION_OWNER o
                   WHERE     a.action_id = o.action_id
                         AND a.action_name = 'Admin.start'
                         AND o.user_id = u.user_id) = '+'
            THEN
               'Y'
            ELSE
               'N'
         END
            ""Assigned By User?""
    FROM MD_SITE_USER u
    WHERE     user_name IS NOT NULL
         AND (   CASE
                    WHEN (SELECT o.grant_or_revoke
                            FROM MD_SITE_APP_ACTION a,
                                 MD_SITE_APP_ACTION_OWNER o
                           WHERE     a.action_id = o.action_id
                                 AND a.action_name = 'Admin.start'
                                 AND o.user_id = u.GROUP_ID) = '+'
                    THEN
                       'Y'
                    ELSE
                       'N'
                 END = 'Y'
              OR CASE
                    WHEN (SELECT o.grant_or_revoke
                            FROM MD_SITE_APP_ACTION a,
                                 MD_SITE_APP_ACTION_OWNER o
                           WHERE     a.action_id = o.action_id
                                 AND a.action_name = 'Admin.start'
                                 AND o.user_id = u.user_id) = '+'
                    THEN
                       'Y'
                    ELSE
                       'N'
                 END = 'Y')
     ORDER BY user_or_group, user_name;
    ";
    

    【讨论】:

    • 有什么理由,这样的东西行不通吗?
    • 我尝试从文件中读取 SQL,但它出错了(语法)。我知道我错过了一些简单的东西。我确实将它剪切并粘贴到我的代码中并且它以这种方式工作,但我希望能够从文件中读取 SQL。不允许存储过程。
    • 如果你从一个文件中读取它,你不需要转义引号(如果你这样做了)
    • 从文件读取与将其作为字符串包含的唯一区别是引号的转义,我没有以@符号开头。
    • 根据我的 messagebox.show,当使用流式阅读器读取行时,正在添加字符。不知道为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多