мое первое заявление на c # ... как правильно это сделать? - PullRequest
3 голосов
/ 28 ноября 2011

Как видно из названия, это моя первая попытка C #, поэтому, пожалуйста, будьте спокойны.(Как новичок я обещаю задать несколько простых вопросов для профессионалов C #, чтобы получить некоторые простые моменты!) Я использую ExcelDNA для создания UDF в Excel, который будет запрашивать нашу базу данных mysql.Я добавил ExcelDNA и MySQL соединитель DLL в качестве ссылок.У меня есть следующий код, который выдает несколько ошибок:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;  
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;
using ExcelDna.Integration;
using MySql.Data.MySqlClient;

namespace my_test
{
public partial class ThisAddIn
{
    [ExcelFunction(Description = "Multiplies two numbers", Category = "Useful functions")]
    public static MultiplyThem(string[] args)
    {

        string connString = "Server=localhost;Port=3306;Database=test;Uid=root;password=p-word";
        MySqlConnection conn = new MySqlConnection(connString);
        MySqlCommand command = conn.CreateCommand();
        command.CommandText = "SELECT field_value FROM customers";
        try
        {
            conn.Open();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        string myvariable = "bad";

        MySqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            myvariable = reader["field_value"].ToString;
        }

        return myvariable.ToString;
    }




    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
    }

}
}

Вот ошибки:

Ошибка 1 Не удается преобразовать группу методов «ToString» в тип без двойного делегирования «double».Вы намеревались вызвать метод?
Ошибка 2 Метод должен иметь тип возвращаемого значения
Ошибка 3 Не удалось преобразовать группу методов «ToString» в тип «string» без делегата.Вы намеревались вызвать метод?
Ошибка 4 Поскольку my_test.ThisAddIn.MultiplyThem (string []) 'возвращает void, за ключевым словом return не должно следовать выражение объекта

Ответы [ 6 ]

5 голосов
/ 28 ноября 2011

Ошибка 1: ToString - это метод. вам нужно reader["field_value"].ToString();

Ошибка 2: Все методы должны указывать тип возвращаемого объекта. В этом случае вы хотите, чтобы MultiplyThem возвращал строку. public static string MultiplyThem(string[] args)

Ошибка 3: см. Ошибка 1

Ошибка 4: см. Ошибка 2

3 голосов
/ 28 ноября 2011

Если вы собираетесь использовать Excel-DNA, вам нужно извлечь ссылки на сборки Visual Studio Tools for Office (VSTO) и соответствующие биты в вашем коде - вы не можете смешивать две структуры в одна сборка. Части VSTO называются Microsoft.Office.Tools... Так что я предлагаю:

  1. Удалить using Microsoft.Office.Tools.Excel;
  2. Ваш класс надстройки не обязательно должен быть partial (маловероятно, что будут другие "части").
  3. Удалите ThisAddIn_Startup и ThisAddIn_Shutdown - также часть каркаса VSTO.

Ваш Console.WriteLine вряд ли куда-нибудь уйдет - лучше используйте ExcelDna.Logging.LogDisplay.WriteLine.

Еще один совет: установите для ссылки на ExcelDna.Integration.dll значение Скопировать локально: true в листе свойств для ссылки. Таким образом, вы не получите ненужную копию этой сборки в выходном каталоге.

Если вы используете Visual Studio 2010, ваша библиотека, вероятно, будет ориентирована на .NET 4.0. Не забудьте установить версию среды выполнения в файле .dna:

<DnaLibrary RuntimeVersion="v4.0" >
    <ExternalLibrary Path="MyAddIn.dll" />
</DnaLibrary>
2 голосов
/ 28 ноября 2011

Изменить myvariable.ToString на myvariable.ToString().

Измените объявление метода с public static MultiplyThem(string[] args) на public static string MultiplyThem(string[] args).

2 голосов
/ 28 ноября 2011

Пара вещей, на которые стоит обратить внимание:

  1. Ваш метод должен иметь возвращаемую подпись (то есть строку или двойную) или иметь возвращаемую подпись void. Если вы хотите вернуть строку, ваш метод должен выглядеть так:

    public static void MultiplyThem(string[] args)
    
  2. Когда вы читаете значение из считывателя, вам нужно получить к нему доступ следующим образом:

    myvariable = reader["field_value"].ToString();
    
  3. Метод ToString - это метод, который также должен вызываться.
2 голосов
/ 28 ноября 2011

Все ошибки достаточно очевидны.

1) Объявите метод с типом возврата string:

public static string MultiplyThem(string[] args)
//            ^^^^^^

2) Используйте ToString(): return myvariable.ToString();

3) Последняя ошибка исчезнет.

2 голосов
/ 28 ноября 2011

Вот, пожалуйста. У вас есть две основные проблемы:

1) В методе должен быть указан тип возврата или void. Поскольку вы возвращаете строку, я добавил строку между статическим и именем метода.

2) ToString - это метод. Когда вы используете его, вам нужно добавить символы, такие как .ToString ().

public static string MultiplyThem(string[] args)
{

    string connString = "Server=localhost;Port=3306;Database=test;Uid=root;password=p-word";
    MySqlConnection conn = new MySqlConnection(connString);
    MySqlCommand command = conn.CreateCommand();
    command.CommandText = "SELECT field_value FROM customers";
    try
    {
        conn.Open();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

    string myvariable = "bad";

    MySqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        myvariable = reader["field_value"].ToString();
    }

    return myvariable;
}
...