您正在编写一个c#控制台应用程序,用于将数据从一个数据库迁移到另一个数据库。 数据库的行中有图像,我需要使用@param将这些图像包含在SQL语句中,并使用ADO.NET执行这些语句。
我需要生成可以用作@param名称的随机字符串,我正在做这样的事情。
While(blah blah)
{
if (bVisitorPhoto != null)
{
string Picture = RandomString();
SqlParameter picparameter = new SqlParameter();
picparameter.SqlDbType = SqlDbType.Image;
picparameter.ParameterName = Picture;
picparameter.Value = bVisitorPhoto;
command.Parameters.Add(picparameter);
VisitorPhoto = "@"+Picture;
}
string query = "insert into table Values (Picture, "PersonName");
}
public static string RandomString()
{
Random rand = new Random();
string Random_String = "str" + rand.Next(9999999).ToString();
return Random_String;
}
问题是这个错误
“SqlClient.SqlException”变量名'@ str5440049'已经存在 宣布了。
怎么会发生这种情况?但是,一旦我按调试模式运行程序,按F11就像一百万次我面对这个错误
答案 0 :(得分:5)
为什么使用随机而不仅仅是列名+计数器值?
int counter=0;
While(blah blah)
{
if (bVisitorPhoto != null)
{
string Picture = photo+counter.ToString();
SqlParameter picparameter = new SqlParameter();
picparameter.SqlDbType = SqlDbType.Image;
picparameter.ParameterName = Picture;
picparameter.Value = bVisitorPhoto;
command.Parameters.Add(picparameter);
VisitorPhoto = "@"+Picture;
}
string query = "insert into table Values (Picture, "PersonName");
counter++;
}
答案 1 :(得分:3)
您不应为每个方法调用创建新的Random
对象。相反,创建一次,并将其存储在成员变量中:
private static readonly Random _rand = new Random();
public static string RandomString()
{
return "str" + _rand.Next(9999999).ToString();
}
作为更详细的解释,Random.Random()
构造函数使用time-dependent default seed value。如果多个构造函数调用之间没有足够的时间,则种子值将相同。如果你从一个相同的种子开始,生成的数字序列总是相同的。