菜鸟教程小白 发表于 2022-12-12 14:39:38

ios - ASP.NET 存储过程调用将 VarBinary 插入 sql


                                            <p><p>我有一个字符串,它是来自 iOS 的数据字节 base64EncodedString,它是一个非常长的字符串</p>

<pre><code>let imageStr = imageData.base64EncodedString()
</code></pre>

<p>我正在从我的 ios 调用一个 .NET 方法,该方法将调用一个存储过程将这些字节插入数据库。</p>

<p>这是我的 .NET 方法,我将数据类型设置为 VarBinary</p>

<pre><code>public string PostLandGradingImages(List&lt;Images&gt; landingCells)
{
    try
    {
      using (connection = new SqlConnection(connectionString))
      {
            connection.Open();

            using (SqlCommand command = new SqlCommand(&#34;PostLandGradingImages&#34;, connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                for (int i = 0; i &lt; landingCells.Count; i++)
                {
                  command.Parameters.Clear();

                  SqlParameter parameter1 = new SqlParameter(&#34;@Job_No&#34;, SqlDbType.VarChar);
                  parameter1.Value = landingCells.jobNo;
                  parameter1.Direction = ParameterDirection.Input;
                  command.Parameters.Add(parameter1);

                  SqlParameter parameter2 = new SqlParameter(&#34;@Image&#34;, SqlDbType.VarBinary);
                  parameter2.Value = landingCells.imageBytes;
                  parameter2.Direction = ParameterDirection.Input;
                  command.Parameters.Add(parameter2);

                  command.ExecuteNonQuery();
                }
            }
      }
    }
    catch (Exception e)
    {
      return e.Message.ToString();
    }

    return &#34;All Good&#34;;
}
</code></pre>

<p>这是我的图像类,注意我的 imageBytes 被定义为一个字节[]:</p>

<pre><code>public class Images
{
    public string jobNo { get; set; }
    public byte[] imageBytes { get; set; }
}
</code></pre>

<p>我要插入的列定义为 varbinary(MAX)</p>

<p>这是我的存储过程:</p>

<pre><code>ALTER PROCEDURE .
    -- Add the parameters for the stored procedure here
    @Job_No varchar(MAX) = NULL,
    @Image varbinary(MAX) = NULL
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    INSERT INTO LandGradingImages (Job_No, ImageBytes) VALUES (@Job_No, @Image)
END
</code></pre>

<p>我的问题是没有插入任何内容,我的捕获中出现此错误:</p>

<blockquote>
<p>Object reference not set to an instance of an object.</p>
</blockquote>

<p>我的问题是,我做错了什么?我不应该发送 base64EncodedString 还是我没有正确设置我的类(class)?还是我的数据库专栏?</p>

<p>我试过了:</p>

<pre><code>byte[] bytes = System.Convert.FromBase64String(landingCells.imageBytes);

SqlParameter parameter2 = new SqlParameter(&#34;@Image&#34;, SqlDbType.VarBinary, 800000);
parameter2.Value = bytes;
parameter2.Direction = ParameterDirection.Input;
command.Parameters.Add(parameter2);
</code></pre>

<p>仍然不起作用:(我将 imageBytes 更改为字符串。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我将您的代码修改为以下方法。它为每个 <code>Image</code> 创建一个新的 <code>CommandType.StoredProcedure</code>。每个图像也会返回结果,因此您可以查看哪些失败了。在你的方法中,如果你有 10 张图像,而第 9 张失败了,你就不会知道。 </p>

<pre><code>public List&lt;Images&gt; PostLandGradingImages(List&lt;Images&gt; landingCells)
{
    //create a connection to the database
    using (SqlConnection connection = new SqlConnection(Common.connectionString))
    {
      //loop all the images
      for (int i = 0; i &lt; landingCells.Count; i++)
      {
            //create a fresh sql command for every Image
            using (SqlCommand command = new SqlCommand(&#34;PostLandGradingImages&#34;, connection))
            {
                command.CommandType = CommandType.StoredProcedure;

                //add the parameters
                command.Parameters.Add(&#34;@Job_No&#34;, SqlDbType.VarChar).Value = landingCells.jobNo;
                command.Parameters.Add(&#34;@Image&#34;, SqlDbType.VarBinary).Value = landingCells.imageBytes;

                try
                {
                  //open the connection if closed
                  if (connection.State == ConnectionState.Closed)
                  {
                        connection.Open();
                  }

                  //execute the stored procedure
                  command.ExecuteNonQuery();

                  //set the save result to the image
                  landingCells.saveResult = true;
                }
                catch (Exception ex)
                {
                  //handle error per Image
                  landingCells.errorMessage = ex.Message;
                }
            }
      }
    }

    return landingCells;
}
</code></pre>

<p>为了跟踪每个图像的保存结果,我向 Image 类添加了两个属性,但这也可以通过其他各种方式完成。</p>

<pre><code>public class Images
{
    public string jobNo { get; set; }
    public byte[] imageBytes { get; set; }

    public bool saveResult { get; set; }
    public string errorMessage { get; set; }
}
</code></pre>

<p>使用以下代码完成了一个简单的测试。他们都没有给出 NullReference 错误。即使两个属性都为 <code>null</code>,仍然会创建一个数据库条目。</p>

<pre><code>//create a new list with Images
List&lt;Images&gt; landingCells = new List&lt;Images&gt;();

//add some dummy data
landingCells.Add(new Images() { jobNo = null, imageBytes = null });
landingCells.Add(new Images() { jobNo = &#34;Job 1&#34;, imageBytes = null });
landingCells.Add(new Images() { jobNo = null, imageBytes = new byte });
landingCells.Add(new Images() { jobNo = &#34;Job 2&#34;, imageBytes = new byte });

//send the images to be saved
landingCells = PostLandGradingImages(landingCells);

//loop all the images to check the result
for (int i = 0; i &lt; landingCells.Count; i++)
{
    if (landingCells.saveResult == false)
    {
      //display the result for each failed image
      Label1.Text += landingCells.errorMessage + &#34;&lt;br&gt;&#34;;
    }
}
</code></pre>

<p>如果仍然有 NullReference 错误,这意味着您的 List <code>landingCells</code> 本身为 null,或者该 List 中的 Image 对象为 null(在这种情况下,它不应该被添加到 List首先恕我直言)。您可以轻松更改代码段以进行检查。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - ASP.NET 存储过程调用将 VarBinary 插入 sql,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/50176982/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/50176982/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - ASP.NET 存储过程调用将 VarBinary 插入 sql