将参数值从DATACOLUMN转换为字符串?

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
这是我想要插入MS SQL的地方
xxx.jpg.

抛出的Visual Studio是"无法将参数值从DATACOLUMN转换为字符串。"

以下是我的插入代码:
private void MSSQLInsert()
        {
            newProdID = 0;
            
            string ConnStrMSSQL = "Data Source=192.168....;Initial Catalog=xxxx;Persist Security Info=True;User ID=sa;Password=xxxxxx;";
            using (SqlConnection con = new SqlConnection(ConnStrMSSQL)) 
            {
                con.Open();
            
                using (SqlCommand command = new SqlCommand(
                    "INSERT INTO tbRecords VALUES (@sPersonnelCode, @sTerminalCode, " +
                    "@sOperationCode, @sItemCode, @sItemDescription, @nJobOrder, @nMPS, " +
                    "@nRecordType, @nQTY, @dStartTime, @dFinishTime, @sSONumber, @sSONumberItemCode, " +
                    "@dLatestStarting, @dLatestFinishing, @sComputerName, @sDatabase);",
                    con)) 
                {
                    command.Parameters.Add(new SqlParameter("@sPersonnelCode", System.Data.SqlDbType.VarChar, 3));
                    command.Parameters.Add(new SqlParameter("@sTerminalCode", System.Data.SqlDbType.VarChar, 4));
                    command.Parameters.Add(new SqlParameter("@sOperationCode", System.Data.SqlDbType.VarChar, 6));
                    command.Parameters.Add(new SqlParameter("@sItemCode", System.Data.SqlDbType.VarChar, 30));
                    command.Parameters.Add(new SqlParameter("@sItemDescription", System.Data.SqlDbType.VarChar, 70));
                    command.Parameters.Add(new SqlParameter("@nJobOrder", System.Data.SqlDbType.VarChar, 10));
                    command.Parameters.Add(new SqlParameter("@nMPS", System.Data.SqlDbType.VarChar, 5));
                    command.Parameters.Add(new SqlParameter("@nRecordType", System.Data.SqlDbType.Bit));
                    command.Parameters.Add(new SqlParameter("@nQTY", System.Data.SqlDbType.Decimal));
                    command.Parameters.Add(new SqlParameter("@dStartTime", System.Data.SqlDbType.DateTime));
                    command.Parameters.Add(new SqlParameter("@dFinishTime", System.Data.SqlDbType.DateTime));
                    command.Parameters.Add(new SqlParameter("@sSONumber", System.Data.SqlDbType.VarChar, 10));
                    command.Parameters.Add(new SqlParameter("@sSONumberItemCode", System.Data.SqlDbType.VarChar, 20));
                    command.Parameters.Add(new SqlParameter("@dLatestStarting", System.Data.SqlDbType.Date));
                    command.Parameters.Add(new SqlParameter("@dLatestFinishing", System.Data.SqlDbType.Date));
                    command.Parameters.Add(new SqlParameter("@sComputerName", System.Data.SqlDbType.VarChar, 30));
                    command.Parameters.Add(new SqlParameter("@sDatabase", System.Data.SqlDbType.VarChar, 15));
                    command.Parameters["@sPersonnelCode"].Value = strPersonnelCode;
                    command.Parameters["@sTerminalCode"].Value = equalDT.Columns["Tezgah"];
                    command.Parameters["@sOperationCode"].Value = equalDT.Columns["OperationCode"];
                    command.Parameters["@sItemCode"].Value = equalDT.Columns["ItemCode"];
                    command.Parameters["@sItemDescription"].Value = equalDT.Columns["ItemDescription"];
                    command.Parameters["@nJobOrder"].Value = equalDT.Columns["JobOrder"];
                    command.Parameters["@nMPS"].Value = equalDT.Columns["Evrak"];
                    command.Parameters["@nRecordType"].Value = 1;
                    command.Parameters["@nQTY"].Value = 1;
                    command.Parameters["@dStartTime"].Value = dateTimeNow();
                    command.Parameters["@dFinishTime"].Value = dateTimeNow();
                    command.Parameters["@sSONumber"].Value = equalDT.Columns["SONumber"];
                    command.Parameters["@sSONumberItemCode"].Value = equalDT.Columns["SONumberItemCode"];
                    command.Parameters["@dLatestStarting"].Value = equalDT.Columns["LatestStarting"];
                    command.Parameters["@dLatestFinishing"].Value = equalDT.Columns["LatestFinishing"];
                    command.Parameters["@sComputerName"].Value = machineName;
                    command.Parameters["@sDatabase"].Value = getDBname;

                    command.ExecuteNonQuery();

                    // below for seeing colomns in DataTable equalDT
                    //0 takas.Columns.Add(new DataColumn("Tezgah", typeof(string)));
                    //1 takas.Columns.Add(new DataColumn("TezgahAdi", typeof(string)));
                    //2 takas.Columns.Add(new DataColumn("OperationCode", typeof(string)));
                    //3 takas.Columns.Add(new DataColumn("OperationName", typeof(string)));
                    //4 takas.Columns.Add(new DataColumn("ItemCode", typeof(string)));
                    //5 takas.Columns.Add(new DataColumn("ItemDescription", typeof(string)));
                    //6 takas.Columns.Add(new DataColumn("JobOrder", typeof(string)));
                    //7 takas.Columns.Add(new DataColumn("Evrak", typeof(string)));
                    //8 takas.Columns.Add(new DataColumn("QTY", typeof(int)));
                    //9 takas.Columns.Add(new DataColumn("SONumber", typeof(string)));
                    //10 takas.Columns.Add(new DataColumn("SONumberItemCode", typeof(string)));
                    //11 takas.Columns.Add(new DataColumn("LatestStarting", typeof(DateTime)));
                    //12 takas.Columns.Add(new DataColumn("LatestFinishing", typeof(DateTime)));
                }
            }
        }
 

Wim Sturkenboom.

众所周知的成员
加入
2014年8月6日
消息
85
地点
南非Roodepoort
编程经验
10+
我不太确定,但看起来你试图在varchar中转储完整的列。例如。一条线喜欢

C#:
command.Parameters["@sTerminalCode"].Value = equalDT.Columns["Tezgah"];

但正如所说,不确定这是问题。

在侧面注意:
使用SA用户访问您的数据库是一个非常糟糕的习惯。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
没有错!这种方法恰好运作良好。为什么要我使用适配器更改我的代码?在我的方法中,无需使用适配器?你因为改变我的整个代码而导致我失去了时间..

要坦率,因为你的代码是垃圾。如果您使用的是DataTable,那么人们会假设您有多行保存。在这种情况下,您必须通过这些行循环,为每个行呼叫执行executenonQuery,或者将其执行正确的方式,并使用数据适配器在一次转到省份批次。

如果您只有一个记录来保存,那么为什么首先有一个可在线数据?你可以使用一个,但为什么你会,除非你没有告诉我们一些特定要求?如果您坚持使用DataTable存储单个DataRow,那么您仍然必须从表中获取该行并使用其字段值填充参数。

除此之外,更改您必须使用数据适配器的代码不会涉及更多的努力,而不是通过其他方式工作,并且可能更少。
 

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
要坦率,因为你的代码是垃圾。
可以那么,但无论如何,我都知道,因为我在另一个项目中使用了这种方法。
如果您使用的是DataTable,那么人们会假设您有多行保存。
可以从项目的结构中检索一行。
在这种情况下,您必须通过这些行循环,为每个行呼叫执行executenonQuery,或者将其执行正确的方式,并使用数据适配器在一次转到省份批次。
你绝对是对的,但我提到它只有一排数据。
如果您只有一个记录来保存,那么为什么首先有一个可在线数据?
因为有复杂性,我可以用DataTable解决我将两个不同的SQL服务器数据组合使用我的方法。
如果您坚持使用DataTable存储单个DataRow,那么您仍然必须从表中获取该行并使用其字段值填充参数。
我不能考虑一下,首先是使用DataaTable的想法,我很简单。甚至作为一个数据和一个在同一杯水中的DataRow。
除此之外,更改您必须使用数据适配器的代码不会涉及更多的努力,而不是通过其他方式工作,并且可能更少。
我在你的文章中看到了DataAdapter在第一次分配时使用了选择查询,为什么?我不需要那个,因为它让我困惑不知道使用它。

顺便说一下,这对我的处理看起来很好,但即使我已经申请了它仍然被抛出的那样:"从对象类型system.data.datacolumn到已知的受管提供者本机类型,不存在映射。"
剪辑401.jpg.
 
Last edited:

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
我在你的文章中看到了DataAdapter在第一次分配时使用了选择查询,为什么?我不需要那个,因为它让我困惑不知道使用它。

这是为什么我在很多场合抵制发布代码的完美示例。当人们看到代码时,他们想读取 - 或者甚至可能甚至复制和粘贴而不读取它 - 并忽略其他一切。我在那个同一个帖子中具体说明:
我还应该指出,您实际上不需要SelectCommand和FillSchema调用。如果您愿意,您可以简单地构建DataTable Schema。
你只是困惑,因为你没有阅读我为你提供的信息,这样做,浪费了更多的时间和我的。

无论如何,正如我所说,你需要从DataTable获取DataRow,因为这是数据的位置。就像在数据库中一样,行包含列由列描述的数据,因此DataRows包含DataColumns描述的数据。

在另一个备注上,您担心根据我的推荐花时间改变事物,但您很乐意浪费时间写出这样的所有参数:
command.Parameters.Add(new SqlParameter("@sPersonnelCode", System.Data.SqlDbType.VarChar, 3));
// ...
command.Parameters["@sPersonnelCode"].Value = strPersonnelCode;
当你能这样做的时候:
command.Parameters.Add("@sPersonnelCode", SqlDbType.VarChar, 3)).Value = strPersonnelCode;
或者,当数据类型是合适的,就是这样:
command.Parameters.AddWithValue("@nRecordType", 1);
 

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
just this:
command.Parameters.AddWithValue("@nRecordType", 1);

我已经尝试过,但我面对这抛出"从对象类型system.data.datacolumn到已知的受管提供者本机类型,不存在映射。"
所以我必须深入焦点来弄清楚可能的数据类型冲突,阻碍了我的方式。

jmcilhinney:
为您的帮助手提供。你真的很多次帮助我..
 
Last edited:

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
我必须首先从这种方法返回一个数据系统。实际上,这个想法很容易,下面有以下建议完成。

// copying dt datatable to another datatable to find(Select) exact row of data which desired.
        private DataTable SelectRows(DataTable table1)
        {
            DataTable takas = new DataTable();
            takas.Columns.Add(new DataColumn("Tezgah", typeof(string)));
            takas.Columns.Add(new DataColumn("TezgahAdi", typeof(string)));
            takas.Columns.Add(new DataColumn("OperationCode", typeof(string)));
            takas.Columns.Add(new DataColumn("OperationName", typeof(string)));
            takas.Columns.Add(new DataColumn("ItemCode", typeof(string)));
            takas.Columns.Add(new DataColumn("ItemDescription", typeof(string)));
            takas.Columns.Add(new DataColumn("JobOrder", typeof(string)));
            takas.Columns.Add(new DataColumn("Evrak", typeof(string)));
            takas.Columns.Add(new DataColumn("QTY", typeof(int)));
            takas.Columns.Add(new DataColumn("SONumber", typeof(string)));
            takas.Columns.Add(new DataColumn("SONumberItemCode", typeof(string)));
            takas.Columns.Add(new DataColumn("LatestStarting", typeof(DateTime)));
            takas.Columns.Add(new DataColumn("LatestFinishing", typeof(DateTime)));

            DataRow[] result = table1.Select("Tezgah = '" + splitchar + "'");
            foreach (DataRow row in result) 
            {
                takas.Rows.Add(
                    row["Tezgah"], 
                    row["TezgahAdi"], 
                    row["OperationCode"], 
                    row["OperationName"], 
                    row["ItemCode"], 
                    row["ItemDescription"],
                    row["JobOrder"],
                    row["Evrak"],
                    row["QTY"],
                    row["SONumber"],
                    row["SONumberItemCode"],
                    row["LatestStarting"],
                    row["LatestFinishing"]
                    );
            }
            return takas;
        }
 

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
几分钟后,我刚刚应用了这个;现在我有一个datarow :)

        {
            DataTable takas = new DataTable();
            takas.Columns.Add(new DataColumn("Tezgah", typeof(string)));
            .....

            DataRow[] result = table1.Select("Tezgah = '" + splitchar + "'");
            foreach (DataRow row in result) 
            {
                ......
            }
            return takas.Rows[0];
        }
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
几分钟后,我刚刚应用了这个;现在我有一个datarow :)

        {
            DataTable takas = new DataTable();
            takas.Columns.Add(new DataColumn("Tezgah", typeof(string)));
            .....

            DataRow[] result = table1.Select("Tezgah = '" + splitchar + "'");
            foreach (DataRow row in result) 
            {
                ......
            }
            return takas.Rows[0];
        }

什么是额外的DataTable?为什么不仅仅是这样的:
DataRow result = table1.Select("Tezgah = '" + splitchar + "'").FirstOrDefault();
如果没有匹配,那将返回第一个匹配或null。如果永远不会有多个匹配,那么使用singledefault。如果首先总会有至少一个匹配。如果总是有一个匹配使用单身。如果将始终存在一个或多个匹配,那么您也可以仅供索引数组:
DataRow result = table1.Select("Tezgah = '" + splitchar + "'")[0];
 

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
什么是额外的DataTable?为什么不仅仅是这样的:
DataRow result = table1.Select("Tezgah = '" + splitchar + "'").FirstOrDefault();
如果没有匹配,那将返回第一个匹配或null。如果永远不会有多个匹配,那么使用singledefault。如果首先总会有至少一个匹配。如果总是有一个匹配使用单身。如果将始终存在一个或多个匹配,那么您也可以仅供索引数组:
DataRow result = table1.Select("Tezgah = '" + splitchar + "'")[0];
总是一排,但是,你的建议我最好更喜欢使用firstordfault()以获得更多好处,因为可能还有另一个"Tezgah" = "TerminalCode"这可能来自普遍的SQL。一切都从普遍的SQL的数据开始,我在我的项目中检索到一个名为dt的项目中。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
总是一排,但是,你的建议我最好更喜欢使用firstordfault()以获得更多好处,因为可能还有另一个"Tezgah" = "TerminalCode"这可能来自普遍的SQL。一切都从普遍的SQL的数据开始,我在我的项目中检索到一个名为dt的项目中。

如果总会至少有一场比赛,那么,正如我已经说过的那样,你会先打电话给。这"OrDefault"部分是如果列表中没有项目,则允许返回任何内容。你说清单中总会有一个项目,所以你不需要"OrDefault"。关于哪种调用的方法中,从来没有任何歧义:

单身:列表中总会有一个项目。
singledefault:列表中永远不会有一个项目,但可能没有。
首先:列表中总会有一个项目,可能更多。
firstordefault:列表中可能有零,一个或多个项目。
 

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
如果总会至少有一场比赛,那么,正如我已经说过的那样,你会先打电话给。这"OrDefault"部分是如果列表中没有项目,则允许返回任何内容。你说清单中总会有一个项目,所以你不需要"OrDefault"。关于哪种调用的方法中,从来没有任何歧义:

单身:列表中总会有一个项目。
singledefault:列表中永远不会有一个项目,但可能没有。
首先:列表中总会有一个项目,可能更多。
firstordefault:列表中可能有零,一个或多个项目。

有趣地与另一种方法出来的东西,这是一个重要的方法,在你的情况下没有必要下面。
// copying dt datatable to another datatable to find(Select) exact row of data which desired.
        private DataRow SelectRows(DataTable table1)
        {
            //DataTable takas = new DataTable();
            //takas.Columns.Add(new DataColumn("Tezgah", typeof(string)));
            //takas.Columns.Add(new DataColumn("TezgahAdi", typeof(string)));
            //takas.Columns.Add(new DataColumn("OperationCode", typeof(string)));
            //takas.Columns.Add(new DataColumn("OperationName", typeof(string)));
            //takas.Columns.Add(new DataColumn("ItemCode", typeof(string)));
            //takas.Columns.Add(new DataColumn("ItemDescription", typeof(string)));
            //takas.Columns.Add(new DataColumn("JobOrder", typeof(string)));
            //takas.Columns.Add(new DataColumn("Evrak", typeof(string)));
            //takas.Columns.Add(new DataColumn("QTY", typeof(int)));
            //takas.Columns.Add(new DataColumn("SONumber", typeof(string)));
            //takas.Columns.Add(new DataColumn("SONumberItemCode", typeof(string)));
            //takas.Columns.Add(new DataColumn("LatestStarting", typeof(DateTime)));
            //takas.Columns.Add(new DataColumn("LatestFinishing", typeof(DateTime)));

            DataRow result = table1.Select("Tezgah = '" + splitchar + "'").Single();

            //foreach (DataRow row in result) 
            //{
            //    takas.Rows.Add(
            //        row["Tezgah"], 
            //        row["TezgahAdi"], 
            //        row["OperationCode"], 
            //        row["OperationName"], 
            //        row["ItemCode"], 
            //        row["ItemDescription"],
            //        row["JobOrder"],
            //        row["Evrak"],
            //        row["QTY"],
            //        row["SONumber"],
            //        row["SONumberItemCode"],
            //        row["LatestStarting"],
            //        row["LatestFinishing"]
            //        );
            //}
            return result;
        }

我将删除该部分并使用以下方式更改一行代码:
DataRow result = table1.Select("Tezgah = '" + splitchar + "'").Single();
 

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
我注意到了一个更有趣的事情。它是SQL Provider与AddWithValue()方法一起工作,然后在下面使用以下方法,这不帮助我在SQL提供者中看到一些东西:
command.Parameters.Add(new SqlParameter("@sDatabase", System.Data.SqlDbType.VarChar, 15));                    command.Parameters["@sPersonnelCode"].Value = strPersonnelCode;



在我用addwithvalue()改变了我的代码后,导致我在下面的SQL表达式中看到一个大的好处:
untitled.png.

这是一个很好的机会,看看可能存在问题的错误或提供想法。
 

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
我最近发现的另一件事是与DataRow的SQL表达式,这是一个屏幕截图显示:
另一个.png
我们必须始终使用列名称使用SQL表达式使用DataRow。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
我最近发现的另一件事是与DataRow的SQL表达式,这是一个屏幕截图显示:
查看附件120.
我们必须始终使用列名称使用SQL表达式使用DataRow。

不。任一名称或序数会同样好。该代码的问题不是索引,而是您使用字符串连接将文字值插入SQL代码而不是使用参数。
 

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
我认为现在唯一看到的问题,这是:getDateTimeforrecord
我需要将一个适当的数据atime转化为sql ..我会努力。

private void MSSQLInsert()
        {
            // below string can use directly in sql expression without ' (quote-mark) like this ->  " + getdatetimeForRecord + "
            string getdatetimeForRecord = "CURRENT_TIMESTAMP";

            string ConnStrMSSQL = "Data Source=xxxxxx;Initial Catalog=xxxxx;Persist Security Info=True;User ID=xx;Password=xxxxx;";
            using (SqlConnection con = new SqlConnection(ConnStrMSSQL)) 
            {
                con.Open();
                using (SqlCommand command = new SqlCommand(
                    "INSERT INTO tbRecords VALUES (@sPersonnelCode, @sTerminalCode, " +
                    "@sOperationCode, @sItemCode, @sItemDescription, @nJobOrder, @nMPS, " +
                    "@nRecordType, @nQTY, @dStartTime, @dFinishTime, @sSONumber, @sSONumberItemCode, " +
                    "@dLatestStarting, @dLatestFinishing, @sComputerName, @sDatabase);",
                    con)) 
                {
                    command.Parameters.AddWithValue("@sPersonnelCode", strPersonnelCode);
                    command.Parameters.AddWithValue("@sTerminalCode", equalDataRow["Tezgah"]);
                    command.Parameters.AddWithValue("@sOperationCode", equalDataRow["OperationCode"]);
                    command.Parameters.AddWithValue("@sItemCode", equalDataRow["ItemCode"]);
                    command.Parameters.AddWithValue("@sItemDescription", equalDataRow["ItemDescription"]);
                    command.Parameters.AddWithValue("@nJobOrder", equalDataRow["JobOrder"]);
                    command.Parameters.AddWithValue("@nMPS", equalDataRow["Evrak"]);
                    command.Parameters.AddWithValue("@nRecordType", 1);
                    command.Parameters.AddWithValue("@nQTY", 1);
                    command.Parameters.AddWithValue("@dStartTime", getdatetimeForRecord);
                    command.Parameters.AddWithValue("@dFinishTime", getdatetimeForRecord);
                    command.Parameters.AddWithValue("@sSONumber", equalDataRow["SONumber"]);
                    command.Parameters.AddWithValue("@sSONumberItemCode", equalDataRow["SONumberItemCode"]);
                    command.Parameters.AddWithValue("@dLatestStarting", equalDataRow["LatestStarting"]);
                    command.Parameters.AddWithValue("@dLatestFinishing", equalDataRow["LatestFinishing"]);
                    command.Parameters.AddWithValue("@sComputerName", machineName);
                    command.Parameters.AddWithValue("@sDatabase", getDBname);

                    command.ExecuteNonQuery();


getDateTimeFereorecord的Current_Timestamp与引号转到SQL,然后导致问题。这是证明。
A-1.Png.
 

Socarsky.

众所周知的成员
加入
2014年3月3日
消息
59
编程经验
Beginner
不。任一名称或序数会同样好。该代码的问题不是索引,而是您使用字符串连接将文字值插入SQL代码而不是使用参数。
我相信,通过Wraw通过查看DataRumn的角色传递DataColumn(s)数据来指定此事。没有跳过事件,您可以使用跳跃其Colomn的订单指定代码。但是在使用Colomn的名称通过用String传递他们的名称后,我实现了正确的目标,意味着我提供右列。所以我声称这么做。即使它也变成了奇怪的奇怪。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,731
地点
悉尼,澳大利亚
编程经验
10+
我相信,通过Wraw通过查看DataRumn的角色传递DataColumn(s)数据来指定此事。没有跳过事件,您可以使用跳跃其Colomn的订单指定代码。但是在使用Colomn的名称通过用String传递他们的名称后,我实现了正确的目标,意味着我提供右列。所以我声称这么做。即使它也变成了奇怪的奇怪。

如果它对你不起作用,那是因为你做错了,不是因为它不起作用。您最有可能使用错误的列索引。
 
最佳 底部