【问题标题】:Writing information from SQL Server to C#将信息从 SQL Server 写入 C#
【发布时间】:2015-06-09 20:45:08
【问题描述】:

下面我有一段代码应该从我的数据库中写出列,但是当我尝试执行时,它给了我一个异常,说它无法读取没有值的列,但它是错误的,因为它应在我希望从中获取信息的列中包含日期。

这是表定义:

TABLE_CATALOG TABLE_SCHEMA TABLE_NAME           TABLE_TYPE
PATRICK_DEV   dbo          FILE_DATE_PROCESSED  BASE TABLE

代码如下:

try
{
    SqlConnection connect = new SqlConnection("Server=OMADB01;Database=PATRICK_DEV;Trusted_Connection=True;");
    connect.Open();

    SqlCommand command = new SqlCommand("INSERT FILE_DATE_PROCESSED(UID, FILE_DATE_PROCESSED, FILE_NAME, DATE_ENTERED) SELECT newid(), '2015-12-31 19:32:45', 'myfilename.txt', getdate()", connect);

    SqlDataReader reader = null;
    reader = command.ExecuteReader();

    while (reader.Read())
    {
        Console.WriteLine(reader["FILE_DATE_PROCESSED"].ToString());
        Console.WriteLine(reader["DATE_ENTERED"].ToString());
    }

    connect.Close();
}
catch (Exception e)
{
   Console.WriteLine(e.ToString());
}

这就是我现在正在处理的:我有一个 SQL 数据库,看起来像这样:

UID FILE_DATE_PROCESSED FILE_NAME DATE_ENTERED

在这个数据库中,每次我添加一个文件时,第 2 列应该包含我上次输入文件的时间,第 4 列应该包含我现在输入文件的时间。这是我正在寻找的结果:

UID     FILE_DATE_PROCESSED FILE_NAME      DATE_ENTERED
random  random date         the file name  the current date
number 

如果有不同于我发布的解决此问题的方法,请告诉我,我将非常感激。

【问题讨论】:

  • 您正在执行 INSERT 操作,没有可回读的内容
  • 要获取表定义,请使用SELECT * FROM information_schema.tables,这应该会为您提供表列表。如果您需要完整的独立查询来获取表定义,请参阅stackoverflow.com/questions/6215459/…
  • @Steve 在 Insert 语句之后有一个 select 语句。不滚动就很难看清楚。
  • @Mark NO,SELECT 用于将成本值提供给 INSERT 语句。查询不返回它。如果您在 INSERT 上使用 ExecuteReader,则不会返回任何列名,因此会出现错误
  • @史蒂夫。呃,快点读吧,抱歉

标签: c# sql-server


【解决方案1】:

您的查询执行 INSERT(即。将数据添加到您的表中)它不会检索任何记录。 T-SQL could use a SELECT subquery 中的 INSERT 语句用于提供 INSERT 之后列出的列所请求的值。

因此,您的查询每次运行时都会添加一条新记录,但该查询没有返回任何列,并且在不存在的列上使用读取器索引器会产生上述错误。

如果您只想读取值,那么您应该将查询更改为

try
{
    using(SqlConnection connect = new SqlConnection(....))
    using(SqlCommand command = new SqlCommand(
        @"SELECT FILE_DATE_PROCESSED, DATE_ENTERED FROM FILE_DATE_PROCESSED", connect))
    {
        connect.Open();
        using(SqlDataReader reader = command.ExecuteReader())
        {
           while (reader.Read())
           {
                 Console.WriteLine(reader["FILE_DATE_PROCESSED"].ToString());
                 Console.WriteLine(reader["DATE_ENTERED"].ToString());
           }
        }
   }
}
catch (Exception e)
{
   Console.WriteLine(e.ToString());
}

我还建议更改列名 FILE_DATE_PROCESSED 或表名,因为有两个同名对象可能会造成无穷无尽的混乱和极好的错误制造者

【讨论】:

  • 它说 from 不是正确的语法。然后当我摆脱它时,它对我大喊大叫
  • SELECT 查询的基本语法是SELECT <fieldnames separated with comma> FROM <table name> 。因此,如果您收到语法错误,我认为您的姓名有问题。尝试在字段名称[FILE_DATE_PROCESSED] 和同一张表周围放置方括号。同时我想做一个小测试
  • 不,使用与表的确切名称相同的列名没有问题,只是混淆。请张贴究竟是什么错误,并重新检查您的代码是否有拼写错误或其他细微的拼写错误
  • System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的第一次机会异常附加信息:关键字“FROM”附近的语法不正确。
  • 这是我收到的错误。我重新检查了我的代码,我仍然得到同样的错误,即使有括号
【解决方案2】:

您没有选择语句。更改以添加带有名称的 select 语句可能会有所帮助:

     @cmdText = @"DECLARE @FILE_DATE_PROCESSED DATETIME = '2015-12-31 19:32:45',
            @DATE_ENTERED DATETIME =getdate()
    INSERT FILE_DATE_PROCESSED(UID, FILE_DATE_PROCESSED, FILE_NAME, DATE_ENTERED) 
    SELECT newid(), @FILE_DATE_PROCESSED, 'myfilename.txt',@DATE_ENTERED
    SELECT @FILE_DATE_PROCESSED AS FILE_DATE_PROCESSED, @DATE_ENTERED as DATE_ENTERED"
 SqlCommand command = new SqlCommand(@cmdText)

【讨论】:

  • 谢谢。问题是,我不认为 AS 是正确的语法。我这么说是因为运行代码时出现异常,提示关键字“AS”附近的语法不正确
  • 嗯,我在 SSMS 中工作。 AS 应该是可选的 - 尝试删除
  • 对不起,我误读了你原来的 SQL。我已经用可能更好的方法更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 2020-03-28
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多