Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DbCommand的自定义可视化工具_C#_Visual Studio 2013_Debuggervisualizer - Fatal编程技术网

C# DbCommand的自定义可视化工具

C# DbCommand的自定义可视化工具,c#,visual-studio-2013,debuggervisualizer,C#,Visual Studio 2013,Debuggervisualizer,您好,我正在尝试为应在Visual studio 2013中使用的DbCommand对象创建自定义可视化工具 我有以下代码 using VisualizerTest; using Microsoft.VisualStudio.DebuggerVisualizers; using System; using System.Data.Common; using System.Diagnostics; using System.IO; using System.Runtime.Serializatio

您好,我正在尝试为应在Visual studio 2013中使用的DbCommand对象创建自定义可视化工具

我有以下代码

using VisualizerTest;
using Microsoft.VisualStudio.DebuggerVisualizers;
using System;
using System.Data.Common;
using System.Diagnostics;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Windows.Forms;

[assembly: DebuggerVisualizer(typeof(TestVisualizer), typeof(CommandObjectSource), Target = typeof(DbCommand), Description = "Test")]

namespace VisualizerTest
{
    public class TestVisualizer : DialogDebuggerVisualizer
    {
        protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
        {
            DbCommand command;
            try
            {
                using (Stream stream = objectProvider.GetData())
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    command = (DbCommand)formatter.Deserialize(stream);
                }
                MessageBox.Show(command.CommandText);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}


namespace VisualizerTest
{
    [Serializable]
    public class CommandObjectSource : VisualizerObjectSource
    {
        public override void GetData(object target, Stream outgoingData)
        {
            if (target != null && target is DbCommand)
            {
                DbCommand command = (DbCommand)target;

                BinaryFormatter formatter = new BinaryFormatter();

                formatter.Serialize(outgoingData, command);
            }
        }
    }
}
但是,
CommandObjectSource
从未被调用,相反,我得到了一个异常

Microsoft.VisualStudio.DebuggerVisualizers.DebugViewerShim.RemoteObjectSourceException: Type 'System.Data.SqlClient.SqlCommand' in Assembly 'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.
我的理解是,通过使用自定义源代码,我可以绕过序列化问题

作为旁注,我尝试将
Target=typeof(DbCommand)
更改为
Target=typeof(SqlCommand)
,但没有任何区别

测试代码:

class Program
{
    static void Main(string[] args)
    {

        using (SqlCommand command = new SqlCommand("SELECT Field1 FROM table WHERE Field2 = @Value1"))
        {
            command.Parameters.AddWithValue("@Value1", 1338);
            TestValue(command);
        }

        Console.ReadKey();
    }

    static void TestValue(object value)
    {
        VisualizerDevelopmentHost visualizerHost = new VisualizerDevelopmentHost(value, typeof(TestVisualizer));
        visualizerHost.ShowVisualizer();
    }
}

由于您显式创建的是
VisualizerDevelopmentHost
它不会使用
DebuggerVisualizatorAttribute
,因此您必须将
命令ObjectSource
作为第三个参数传入:

VisualizerDevelopmentHost visualizerHost = 
    new VisualizerDevelopmentHost(value, typeof(TestVisualizer),                  
                                         typeof(CommandObjectSource));
通过此更改,将调用
CommandObjectSource
,但仍然存在序列化问题,因为
BinaryFormatter
还需要将类标记为
Seralizabe

因此,您可能应该只包含
CommandText
(或者创建一个新的DTO对象,并在需要多个属性时对其进行序列化),包括:

并用以下文字阅读:

public class TestVisualizer : DialogDebuggerVisualizer
{
    protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
    {
        string command;
        try
        {
            command = new StreamReader(objectProvider.GetData()).ReadLine();
            MessageBox.Show(command);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}

当我开始工作时,我会试试这个,如果它有效,我会很高兴:)
public class TestVisualizer : DialogDebuggerVisualizer
{
    protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
    {
        string command;
        try
        {
            command = new StreamReader(objectProvider.GetData()).ReadLine();
            MessageBox.Show(command);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
}