从 c# 表单应用程序发布到 api 时,我无法将数据发送到日期时间
Posted
技术标签:
【中文标题】从 c# 表单应用程序发布到 api 时,我无法将数据发送到日期时间【英文标题】:I cannot send data to datetime when posting to api from c# form application 【发布时间】:2021-07-10 05:36:14 【问题描述】:我使用 c# 表单应用程序发布到 api。我需要发送的数据是日期时间。我正在编写下面的代码,但无法发送日期时间。
private void button1_Click(object sender, EventArgs e)
DateTime datetimeValues = DateTime.Now;
var values = new Values()
name = "example_name",
datetime = datetimeValues
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:20295/");
HttpResponseMessage response = client.PostAsJsonAsync("api/test", values).Result;
当我编写此代码时,发送其他数据没有任何问题,但日期时间发送为空。可能是什么问题?
api/test 发布请求;
public string Post(Data data)
try
DataTable dt = new DataTable();
string query = @"insert into Table
(name, addedDate)
values(
'"+data.name+"', '"+data.addedDate+"')";
using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["App"].ConnectionString))
using (var cmd = new SqlCommand(query, con))
using (var da = new SqlDataAdapter(cmd))
cmd.CommandType = CommandType.Text;
da.Fill(dt);
return "Successful";
catch (Exception ex)
return "Error!" + ex.Message;
【问题讨论】:
请附上api/test
上处理POST请求的代码。没有这些信息将很难为您提供帮助
我添加了 api / test post request @AndreiKhotko
你的代码中有很多小问题。您能否也添加Data
类的定义,并在我写您问题的答案时告诉您使用什么数据库?
我使用的是 ms sql server。数据类中有我要发送的数据。我发送这些数据没有问题。但是当我想通过 winform 发送日期时间时,它将它添加为空。 @AndreiKhotko
如果可能的话,我建议使用相同类型的客户端和服务器端(或使两者都遵循相同的界面)以避免此类问题
【参考方案1】:
当我写这段代码时,发送其他数据没有任何问题,但是 datetime 发送为 null
那是因为您在服务器上的 Data
类具有名为 DateTime addedDate
的属性,而客户端发送带有字段 DateTime datetime
的合同 Values
。服务器接受名称为addedDate
的DateTime
字段。
所以你有几个选择来修复它:
将客户端上的属性从Values.datetime
重命名为
Values.addedDate
将服务器上的属性从 Data.addedDate
重命名为
Data.datetime
取决于所使用的 JSON 序列化库
服务器,使用 JSON PropertyName 属性。例如,对于
库 JSON.NET (Newton JSON) 它将是 [JsonProperty("name")]
。
请参阅此处的文档
(link)
附:与主要问题无关的建议:不要像您那样直接在查询字符串中将参数的值添加到 SQL 查询中。这是数据库安全性的一个巨大漏洞。这是众所周知的问题,称为SQL-Injection technique。为避免它使用command.Parameters.Add()
方法。在你的情况下,它会是这样的:
DataTable dt = new DataTable();
string query = "insert into Table (name, addedDate) values(@name, addedDate)";
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["App"].ConnectionString))
using(var cmd = new SqlCommand(query, con))
using(var da = new SqlDataAdapter(cmd))
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = data.name;
cmd.Parameters.Add("@addedDate", SqlDbType.DateTime2);
cmd.Parameters["@addedDate"].Value = data.addedDate;
da.Fill(dt);
【讨论】:
在您为解决方案编写之后,我再次查看了我的代码并意识到我遗漏了一个小细节。我也会考虑你的建议。问题解决了。谢谢! 您可以在一行中添加参数和值,例如:cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = data.name;
。这是通常的形式。【参考方案2】:
尝试在 api/test 上将日期时间作为字符串发送,并在后端使用 DateTime.TryParse();
将日期转换为 DateTime
格式的日期
【讨论】:
以上是关于从 c# 表单应用程序发布到 api 时,我无法将数据发送到日期时间的主要内容,如果未能解决你的问题,请参考以下文章
将表单从客户端发布到 AWS API 网关功能时如何修复 CORS 错误?
如何从表单将 2GB+ 的大文件上传到 .NET Core API 控制器?