【问题标题】:How to make new datatable using other tables如何使用其他表制作新的数据表
【发布时间】:2017-06-01 20:29:09
【问题描述】:

我想从其他表创建新表并发送电子邮件。但是,它在sda.Fill(dt); 上一直出现错误

System.Data.SqlClient.SqlException:'(' 附近的语法不正确。 关键字“打开”附近的语法不正确。

private DataTable GetData() 
{
    string connString = @"Data Source=aa.database.windows.net;Initial Catalog=aa;Persist Security Info=True;User ID=aa;Password=aa";

    string query = "CREATE TABLE new_table AS(SELECT ID, Employee, Name, Open Date, Task FROM tblEmployees, tblEmployees, Stores, Stores, tblTasks)";
    using (SqlConnection con = new SqlConnection(connString))
    {
        using (SqlCommand comm = new SqlCommand(query))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                comm.Connection = con;
                sda.SelectCommand = comm;
                using (DataTable dt = new DataTable())
                {
                    sda.Fill(dt);
                    return dt;
                }
            }
        }
    }
}

【问题讨论】:

  • 请将错误信息添加到问题中。
  • 这真的是mysql吗?因为如果是这样,您需要使用MySqlConnectionMySqlCommand 等,而不是SqlConnection 等。
  • 你为什么首先使用 DataTable?电子邮件与此有什么关系?
  • 我不知道这是否是在 mysql 上创建表的正确语法,但无论哪种方式都不会返回结果集。我认为您不想创建表格,您可能只想选择。
  • @Crowcoder 我添加它。哦,是的,它不是 mysql。

标签: c# sql asp.net database


【解决方案1】:
CREATE TABLE new_table AS (SELECT ...

如果您的新对象完全由另一个表中的 SELECT 定义,则您需要CREATE VIEW,而不是CREATE TABLE。并且不应该有括号。正如@babak-nafias 所说,列名中不能有空格 - 或者应该用 "" 引号或 [] 括号括起来。

CREATE VIEW new_view AS SELECT ID, Employee, Name, Open Date, Task FROM tblEmployees, tblEmployees, Stores, Stores, tblTasks;

最后 - 如果您选择所有这些表 - tblEmployee 选择了两次! -- 没有JOIN 关系甚至WHERE 子句,你会得到:

  • 大量相同的行
  • 不知道从哪个表获取名称时出现歧义错误

【讨论】:

    【解决方案2】:

    您正在引用一个包含空格的列名。将Open Date 更改为[Open Date],您的查询应该可以工作。

    您还缺少右括号。

    【讨论】:

    • 好收获!并且需要添加右括号或仅删除 CREATE TABLE new_table AS(
    【解决方案3】:

    错误消息是指您在查询中使用的正确 sql 语法。除非有特殊原因,否则您可以删除查询的第一部分并进行以下操作:

    string query = "SELECT ID, Employee, Name, [Open Date], Task FROM tblEmployees, tblEmployees, Stores, Stores, tblTasks";

    (感谢 Babak Naffas 抓住了列名中的那个空格)

    这应该可以解决SqlException

    另外,DataTable 没有实现IDisposable 那么你为什么要使用Using 语句呢?您也可以删除 Using 声明

    using (SqlDataAdapter sda = new SqlDataAdapter())
    {
        comm.Connection = con;
        sda.SelectCommand = comm;
        DataTable dt = new DataTable();
        sda.Fill(dt);
        return dt;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 2011-03-03
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      相关资源
      最近更新 更多