我有两个类,Fields和FieldValues:Fields如下:
enum FieldType
{
Boolean,
Integer,
String
}
class Fields
{
public FieldType type { get; set; }
public string name { get; set; }
public string GetFieldDeclaration()
{
switch (type)
{
case FieldType.Boolean:
return name + " tinyint(1)";
case FieldType.Integer:
return name + " int";
case FieldType.String:
return name + " varchar(2048)";
default:
return string.Empty;
}
}
和FieldValues:Fields
class FieldValues:Fields
{
public Dictionary<int, string> dictionary { get; set; }
FieldValues(FieldType newType, string newName)
{
type = newType;
name = newName;
dictionary = new Dictionary<int, string>();
}
这些类表示将从xls中提取并插入数据库的一些值。在主程序中,
List<Fields> tableFields = new List<Fields>()
{
new Fields() { name = "id", type = FieldType.Integer },
new Fields() { name = "ECE", type = FieldType.Boolean },
new Fields() { name = "TC", type = FieldType.Boolean },
new Fields() { name = "Categories", type = FieldType.String },
};
string createQuery = "CREATE TABLE `poi_specs_mgu_ece_1.6` (";
//creaza tabelul in functie de cate field-uri(coloane) sunt in lista
for(var i = 0; i < tableFields.Count; i++)
{
createQuery += "\n\t" + tableFields[i].GetFieldDeclaration() + (i == tableFields.Count - 1 ? string.Empty : ",");
}
createQuery += "\n);";
//[WORK]create insert statement
List<FieldValues> fieldValues = new List<FieldValues>()
{
new FieldValues(tableFields[0]) {
dictionary = new Dictionary<int, string>()
{
{0, "test" },
{1, "test" },
{2, "test" },
{3, "test" },
{4, "test" },
{5, "test" }
}
},
new FieldValues(tableFields[1]) {
dictionary = new Dictionary<int, string>()
{
{0, "x" },
{1, "x" },
{2, " " },
{3, "x" },
{4, " " },
{5, "x" }
}
},
new FieldValues(tableFields[2]) {
dictionary = new Dictionary<int, string>()
{
{0, "x" },
{1, "x" },
{2, "x" },
{3, "x" },
{4, " " },
{5, "x" }
}
},
new FieldValues(tableFields[3]) {
dictionary = new Dictionary<int, string>()
{
{0, "Car" },
{1, "Travel" },
{2, "Stopping Possibilities" },
{3, "Petrol Stations" },
{4, "Rest Areas" },
{5, "Travel" }
}
},
};
string createQuery2 = createQuery + "\n INSERT INTO `poi_specs_mgu_ece_1.6` (";
for (var i = 0; i < tableFields.Count; i++)
{
createQuery2 += "\n\t" + tableFields[i].GetFieldDeclaration() + (i == tableFields.Count - 1 ? string.Empty : ",");
}
createQuery2 += ")\n VALUES ( ";
for (var i = 0; i < fieldValues.Count; i++)
{
for (var j = 0; j < fieldValues[i].dictionary.Count; j++)
{
createQuery2 += "\n\t" + fieldValues[i].dictionary[j];
}
}
createQuery2 += " \n);";
File.WriteAllText("output.txt", createQuery2);
Console.WriteLine(createQuery2);
Console.ReadKey();
编译时出现以下错误:
错误CS1729&#39; FieldValues&#39;不包含带有1个参数的构造函数。
我真的不明白为什么FieldValues的构造函数在这里不起作用。
答案 0 :(得分:4)
您的班级FieldValues
有以下(非公开btw。)构造函数:
FieldValues(FieldType newType, string newName)
但是你这样称呼它:
new FieldValues(tableFields[0])
因此错误。你可能也想传递这种类型,例如:
new FieldValues(FieldType.String, tableFields[0])
或添加另一个暗示特定类型的构造函数,例如:
public FieldValues(string newName)
{
type = FieldType.String;
name = newName;
dictionary = new Dictionary<int, string>();
}
或者(正如@JeppeStigNielsen指出的那样)
public FieldValues(string newName) : this(FieldType.String, newName)
或者您移动type参数并将其设为可选
public FieldValues(string newName, FieldType newType = FieldType.String)
另一方面,"penis"
在开发过程中不是一个好的占位符文本,你可能会忘记把它拿出来(双关语并非意图)。我已经冒昧地在你的问题中用"test"
替换它。
答案 1 :(得分:1)
您的错误告诉您有一个构造函数声明为:
FieldValues(FieldType newType, string newName)
并尝试仅使用1个参数调用它:
new FieldValues(tableFields[2])
您可以使用接受1参数的构造函数重载构造函数,或者在调用它时需要给出第二个参数。
修改强>
一个解决方案也可能是使用一个可以传递类型为Fields
的变量作为参数的构造函数重载构造函数。
class FieldValues:Fields
{
public Dictionary<int, string> dictionary { get; set; }
public FieldValues(FieldType newType, string newName)
{
type = newType;
name = newName;
dictionary = new Dictionary<int, string>();
}
public FieldValues(Fields values)
{
type = values.type;
name = values.name;
dictionary = new Dictionary<int, string>();
}
然后你仍然可以自己分配字典。
List<FieldValues> fieldValues = new List<FieldValues>()
{
new FieldValues(tableFields[0]) {
dictionary = new Dictionary<int, string>()
{
{0, "test" },
{1, "test" },
{2, "test" },
{3, "test" },
{4, "test" },
{5, "test" }
}
},
<强> EDIT2:强>
正如我刚认识的那样。重载不起作用,因为在你的帖子中你的构造函数不是public
!这对于能够从任何其他类调用它至关重要。我在答案中纠正了这个错误。
答案 2 :(得分:0)
您的FieldValues的Ctor有两个参数,FieldType newType
和s tring newName
。您仅使用一个参数调用它:new FieldValues(tableFields[0])
。
你想要的可能是:
new FieldValues(tableFields[0].Type, tableFields[0].Name)
答案 3 :(得分:0)
非常感谢您的支持。我像这样重载了构造函数
public FieldValues(string newName)
{
type = FieldType.String;
name = newName;
dictionary = new Dictionary<int, string>();
}
和这样的字典部分
new FieldValues(tableFields[0].ToString()) {
dictionary = new Dictionary<int, string>()
{
{0, "test" },
{1, "test" },
{2, "test" },
{3, "test" },
{4, "test" },
{5, "test" }
}
我知道这是noob的东西,但它帮助了我,因为我是c#的新手。 但是,生活和学习。