无法在 SQL Server 2008 中使用 where 子句获取 nvarchar 类型数据

Posted

技术标签:

【中文标题】无法在 SQL Server 2008 中使用 where 子句获取 nvarchar 类型数据【英文标题】:Unable to fetch nvarchar type data with where clause in SQL Server 2008 【发布时间】:2014-04-19 08:26:46 【问题描述】:
string constr = Properties.Settings.Default.Subject_1ConnectionString;

SqlConnection conn = new SqlConnection(constr);
SqlCommand com = new SqlCommand("SELECT * from Subject_Title WHERE Date BETWEEN @hello and @hello1 ", conn);

// com.Parameters.Add("@hello", SqlDbType.NVarChar).Value = textBox1.Text;
// com.Parameters.Add("@hello1", SqlDbType.NVarChar).Value = textBox2.Text;

com.Parameters.Add("@hello", SqlDbType.NVarChar);
com.Parameters["@hello"].Value = textBox1.Text;

com.Parameters.Add("@hello1", SqlDbType.NVarChar);
com.Parameters["@hello1"].Value = textBox2.Text;

// com.Parameters.AddWithValue("@hello", textBox1.Text);
// com.Parameters.AddWithValue("@hello1", textBox2.Text);
SqlDataAdapter da = new SqlDataAdapter(com);
DataSet ds = new DataSet();
da.Fill(ds, "Subject_title");

for (int i = 0; i < 8; i++)

    this.labeltext = this.labeltext + " " + ds.Tables["Subject_Title"].Rows[i]["Date"].ToString();
    this.labeltext = this.labeltext + " " + ds.Tables["Subject_Title"].Rows[i]["Subject"].ToString();
    this.labeltext = this.labeltext + " ";


this.label1.Text = this.labeltext;

这里我没有从数据库中获取任何数据

Date 是我的列名,具有 nvarchar 类型,Subject 是另一个类型为 text 的列。

请大家解决我的问题

【问题讨论】:

你可以用单引号代替双引号,顺便说一句,你的日期类型是datetime 不,我将其保留为 nvarchar 那你永远不会遇到该字段的问题,尽快将其更改为真正的日期时间字段 仍然没有获取任何数据 ntexttextimage 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)varbinary(max)。 See details here 【参考方案1】:

我猜你应该使用: Con.Open(); Con.Close();

但如果我是你,我会这样写代码:

    string constr = Properties.Settings.Default.Subject_1ConnectionString;

    SqlConnection conn = new SqlConnection(constr);
    SqlCommand com = new SqlCommand("SELECT * from Subject_Title WHERE Date BETWEEN \"01-03-14\" and \"01-04-14\" ", conn);

    conn.Open();       
    SqlDataReader reader =com.ExecuteReader();
    while(reader.read())

    this.labeltext += " " + reader.GetString(0);       //Use column ordinal for Date
    this.labeltext += " " + reader.GetString(1)+" ";   //Use column ordinal for Subject
    
    conn.Close()
    this.label1.Text = this.labeltext;

【讨论】:

好的,试试我提供的代码。使用 da.Fill 会将所有数据带到内存中,这在您的情况下会浪费资源。使用 reader.Read() 一次只能获取一条记录。【参考方案2】:

我试图为你想出一个更好的代码库。

你需要:

使用更有意义的名称! hellohello1 之类的参数对于阅读您的代码的人来说不是很有用....另外:不要使用保留关键字命名您的列,例如 Date - 再次:使用对您的上下文更有意义的东西

如果要使用与日期相关的方法,则必须使用DATEDATETIME2(N) 数据类型。如果您已将数据存储为 nvarchar - 您必须先将其转换为 DATE

请始终将您的 SqlConnectionSqlCommand 放入 using(...) .. 块中,以确保正确快速地处理

如果您只需要一个 DataTable - 只需实例化一个 DataTable 并填充它 - 不要使用 DataSet 的不必要的额外开销 - 那只是浪费资源......

代码:

string constr = Properties.Settings.Default.Subject_1ConnectionString;

// if you only need one single data table - use a DataTable - not a DataSet !
DataTable dt = new DataTable();

// *ALWAYS* put your SqlConnection and SqlCommand into using() blocks!
// also - if you want to use BETWEEN, you *MUST* use DATE!
// also: don't call your column "date" - that's a SQL Server reserved keyword! Use a more meaningful name 
// like "DateCreated" or "DateLastUpdated" or something
// and please also use more meaningful parameter names - "hello" and "hello1" is very confusing and not clear!!
using (SqlConnection conn = new SqlConnection(constr))
using (SqlCommand com = new SqlCommand("SELECT * FROM dbo.Subject_Title WHERE CAST(DateCreated AS DATE) BETWEEN @start and @end ", conn))

   // add parameters as DATE type!
   com.Parameters.Add("@start", SqlDbType.Date);
   com.Parameters["@start"].Value = DateTime.Parse(textBox1.Text).Date;

   com.Parameters.Add("@end", SqlDbType.Date);
   com.Parameters["@end"].Value = DateTime.Parse(textBox2.Text).Date;

   SqlDataAdapter da = new SqlDataAdapter(com);

   da.Fill(dt);


for (int i = 0; i < 8; i++)

    this.labeltext = this.labeltext + " " + dt.Rows[i]["Date"].ToString();
    this.labeltext = this.labeltext + " " + ds.Rows[i]["Subject"].ToString();
    this.labeltext = this.labeltext + " ";


this.label1.Text = this.labeltext;

【讨论】:

在 da.fill(dt,"subject_tittle") 给出错误 'System.Data.Common.DataAdapter.Fill(System.Data.DataTable, System.Data.IDataReader) 的最佳重载方法匹配' 有一些无效的参数 日期解析。 .找不到日期类型。 . @user3551226:抱歉,在 T-SQL 和 .NET 数据类型之间搞混了; .NET 只有DateTime - 所以它必须是DateTime.Parse(...),然后使用结果上的.Date 属性从提供的值中获取日期(没有时间部分)

以上是关于无法在 SQL Server 2008 中使用 where 子句获取 nvarchar 类型数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL server 2008中使用SSIS从一个数据库导入数据到另一个数据库,[SQL Server 目标 [22]] 错误: 无法准备 S

无法在 SQL Server 2008 中使用 where 子句获取 nvarchar 类型数据

sql server 2008 无法链接,急求,谢谢各位大侠

Sql server2008! SQL server服务无法启动,并显示错误17113, 修复Sql server2008失败!

无法从 dtexec 在 sql server 2008 中执行 DTS

无法使用 JDBC 在 android 中连接到 sql server 2008