简体   繁体   English

C# SQL SERVER - 无法将 nvarchar 转换为文本?

[英]C# SQL SERVER - Cannot convert nvarchar to text?

I have a problem with a huge project that I am working on.我正在处理的一个大型项目有问题。 I never had this problem before but it started occurring today.我以前从未遇到过这个问题,但它今天开始出现。 Any fixes?任何修复?

error: System.Data.SqlClient.SqlException: 'The data types text and nvarchar are incompatible in the equal to operator.'错误:System.Data.SqlClient.SqlException:“数据类型 text 和 nvarchar 在等于运算符中不兼容。”

I don't understand what It means.我不明白这是什么意思。 I don't want to have an sql injection so I am using parameters.. But it still gives errors.我不想进行 sql 注入,所以我正在使用参数。但它仍然会出错。

Please ask me if you need me to describe something... This is like my 5th post.请问我是否需要我描述一些东西...这就像我的第 5 篇文章。


            using (SqlCommand StrQuer = new SqlCommand("SELECT * FROM login WHERE username=@userid AND password=@password", connection))
            {
                StrQuer.Parameters.AddWithValue("@userid", username.Text.ToLower().Trim());
                StrQuer.Parameters.AddWithValue("@password", obf.Obfuscate(password.Text).ToString());
                SqlDataReader dr = StrQuer.ExecuteReader();
                if (dr.HasRows)
                {
                    Properties.Settings.Default.username = username.Text.ToLower();
                    Properties.Settings.Default.username = obf.Obfuscate(password.Text);
                    RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\howcoolitisX");
                    key.SetValue("username", username.Text.ToLower());
                    key.SetValue("password", obf.Obfuscate(password.Text));
                    key.Close();
                    Form executor = new Loader();
                    executor.Show();
                    this.Hide();
                }
            }

Well, first I'd say that you should probably take a look at how can passwords be stored securely .好吧,首先我要说的是,您或许应该看看如何安全地存储密码。

And as for the issue at hand there are multiple solutions至于手头的问题,有多种解决方案

  1. Either cast the parameters in SQL在 SQL 中转换参数
new SqlCommand("SELECT * FROM login WHERE username= CAST(@userid as text) AND password= CAST(@@passwordas text)", connection)
  1. Or use Parameters.Add instead of Parameters.AddWithValue and set the parameter type explicitly.或者使用Parameters.Add 而不是 Parameters.AddWithValue并明确设置参数类型
StrQuer.Parameters.Add("@userid", SqlDbType.Text);
command.Parameters["@userid"].Value = username.Text.ToLower().Trim();
  1. Or if you can easily change the database then by all means do as Crowcoder suggested and change columns to nvarchar as text is an obsolete datatype或者,如果您可以轻松更改数据库,那么一定要按照Crowcoder 的建议进行操作,并将列更改为nvarchar ,因为text是一种过时的数据类型

IMPORTANT, ntext, text.重要,ntext,文本。 and image data types will be removed in a future version of SQL Server, Avoid using these data types in new development work.和图像数据类型将在 SQL Server 的未来版本中删除,避免在新的开发工作中使用这些数据类型。 and plan to modify applications that currently use them, Use nvarchar(max), varchar(max).并计划修改当前使用它们的应用程序,使用 nvarchar(max)、varchar(max)。 and varbinary(max) instead.和 varbinary(max) 代替。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM