1

ここでは、DataTableを作成する必要がありますが、IDは返されません。エラーはありません。実際には、ここでメールアドレス(epost)を指定し、データベースからIDを返す必要があります。

コーディング部分はここにあります。

public string GetAllMails()
    {
        DataConnection dc = new DataConnection();

        string e="";
        int uid=-1,sid=0;

        DataTable dt = new DataTable();
        dt.Columns.Add("id");
        dt.Columns.Add("uid");
        dt.Columns.Add("email");

        Microsoft.Office.Interop.Outlook.Application oApp;
        Microsoft.Office.Interop.Outlook._NameSpace oNS;
        Microsoft.Office.Interop.Outlook.MAPIFolder oFolder;
        Microsoft.Office.Interop.Outlook._Explorer oExp;

        oApp = new Microsoft.Office.Interop.Outlook.Application();
        oNS = (Microsoft.Office.Interop.Outlook._NameSpace)oApp.GetNamespace("MAPI");
        oFolder = oNS.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
        oExp = oFolder.GetExplorer(false);
        oNS.Logon(Missing.Value, Missing.Value, false, true);

        Microsoft.Office.Interop.Outlook.Items items = oFolder.Items;

        SqlConnection conn = dc.SqlConnection;
        if (conn.State != ConnectionState.Open) conn.Open();
        SqlCommand cmd = new SqlCommand("GetDetailsByEmail", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter param = new SqlParameter();

        foreach (Microsoft.Office.Interop.Outlook.MailItem mail in items)
        {
            if (mail.UnRead == true)
            {
                e=mail.SenderEmailAddress;

               // param   <-- add sql parameters
                cmd.Parameters.Add(new SqlParameter("@epost",e));

                uid = cmd.ExecuteNonQuery();

                //send to db and take the id (uid)

                //if returned id
                DataRow row = dt.NewRow();

                row["id"] = sid;
                sid++;

                row["uid"] = uid;// uid

                row["email"] = e;

                dt.Rows.Add(row);

            }
        }

        return e;
    }

ストアドプロシージャはここにあります

ALTER Procedure [dbo].[GetDetailsByEmail]

@epost nvarchar(50)

AS
BEGIN
Select Medlems_ID,[E-post]
from dbo.Members
where [E-post] = @epost
END

コーディングを編集するとき、uidはintです。

uid = cmd.ExecuteReader(); or uid = cmd.ExecuteScalar(); // it shows me conversion error.here i put as a comment
4

1 に答える 1

9

ドキュメントを読むと、ExecuteNonQuery次の行が表示されます。

接続に対してTransact-SQLステートメントを実行し、影響を受けた行数を返します。

SqlCommand.ExecuteReaderあなたはあなたがしたいことをするために使う必要があります。

編集:

コメントに基づいてコードがどのように見えるかを次に示します。sprocが2列を返すのは少し奇妙ですが、関心があるのは1つだけです。また、複数の行を期待するかどうかも明確ではありません。

if (dc.SqlConnection.State != ConnectionState.Open) 
    dc.SqlConnection.Open();

using (var cmd = new SqlCommand("GetDetailsByEmail", dc.SqlConnection))
{
    cmd.CommandType = CommandType.StoredProcedure;

    foreach (Microsoft.Office.Interop.Outlook.MailItem mail in items)
    {
        if (mail.UnRead)
        {
            e = mail.SenderEmailAddress;

            //this is a little nasty
            if (cmd.Parameters.Count > 0)
                cmd.Parameters.RemoveAt(0);

            cmd.Parameters.AddWithValue("@epost", e);

            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    uid = reader.GetInt32(0);

                    DataRow row = dt.NewRow();
                    row["id"] = sid;
                    sid++;
                    row["uid"] = uid;// uid
                    row["email"] = e;
                    dt.Rows.Add(row);
                }
            }
        }
    }
}
于 2013-02-08T08:53:35.697 に答える