2016-04-22 7 views
10

Ich versuche, eine Zeile in einer Azure-Tabelle basierend auf einer Azure-Funktion zu aktualisieren. Ich sehe, dass die Tabellenbindungen mit einem ICollector umgehen können, der über eine Add-Methode verfügt, die eine Zeile hinzufügt. Ich sehe auch, dass Sie ein IQueryable verwenden, um die Daten zu lesen.Azure-Funktionen Tabellenbindung: Wie aktualisiere ich eine Zeile?

Wie gehen Sie vor, um eine bestimmte Zeile in den Daten zu aktualisieren?

Ich sah in WebJobs etwas in Bezug auf InsertOrReplace, das eine Methode von TableOperations ist, aber ich weiß nicht, ob und wie das ins Spiel kommt und wie es mit Azure-Funktionen verwendet wird.

Antwort

14

Folgendes ist eine Möglichkeit, dies zu tun. Diese Schritte werden mit unserer nächsten Version einfacher, aber für den Moment müssen Sie das Azure Storage SDK manuell einspielen.

Führen Sie zuerst die Schritte im Abschnitt "Paketverwaltung" von this help page aus, um das Azure Storage SDK einzubinden. Sie erhalten eine project.json werden Hochladen, die wie folgt auf Ihre Funktion Ordner aussieht:

{ 
    "frameworks": { 
    "net46":{ 
     "dependencies": { 
     "WindowsAzure.Storage": "7.0.0" 
     } 
    } 
    } 
} 

Hinweis: In der nächsten Version werden wir automatisch die Azure Storage SDK enthalten, so dass Sie es einfach direkt in Ihrem Code verwenden können.

{ 
    "bindings": [ 
    { 
     "name": "input", 
     "type": "manualTrigger", 
     "direction": "in" 
    }, 
    { 
     "name": "table", 
     "type": "table", 
     "tableName": "test", 
     "connection": "<your connection>", 
     "direction": "in" 
    } 
    ] 
} 

Und unten ist der entsprechende Code: Nachdem Sie in der Verpackung gezogen haben, können Sie Funktion Metadaten wie folgt in der Integrieren Registerkarte Registerkarte Erweiterter Editor eingeben. Wir Bindung an ein CloudTable hier, die uns Entitäten lesen/schreiben kann:

#r "Microsoft.WindowsAzure.Storage" 

using System; 
using Microsoft.WindowsAzure.Storage; 
using Microsoft.WindowsAzure.Storage.Table; 

public static void Run(string input, CloudTable table, TraceWriter log) 
{ 
    TableOperation operation = TableOperation.Retrieve<Person>("AAA", "001"); 
    TableResult result = table.Execute(operation); 
    Person person = (Person)result.Result; 

    log.Verbose($"{person.Name} is {person.Status}"); 

    person.Status = input; 
    operation = TableOperation.Replace(person); 
    table.Execute(operation); 
} 

public class Person : TableEntity 
{ 
    public string Name { get;set; } 
    public string Status { get;set; } 
} 

ich eine ManualTrigger für dieses Beispiel verwendet, aber die Tabelle Bindung mit arbeiten, was auch immer Auslöser Sie haben. Mit der obigen Einstellung kann ich einen Wert in das Eingabefeld Ausführen des Portals eingeben und auf Ausführen klicken. Die Funktion fragt die Entität ab, gibt ihre aktuellen Werte aus und aktualisiert sie dann mit meiner Eingabe.

Andere Permutationen sind möglich. Wenn Sie beispielsweise eine Entitätsinstanz von einem anderen Bindungsparameter haben, können Sie die CloudTable auf ähnliche Weise verwenden, um sie zu aktualisieren.

+0

Das ist, was ich brauchte. Habe es funktioniert. Danke –

+0

Scheint seit dem letzten Update nicht mehr zu funktionieren. Siehe: https://social.msdn.microsoft.com/Forums/en-US/8f70fb3c-ad60-4cb4-be7a-a8b46c95ce8c/method-not-found-microsoftwindowsazurestoragetabletableoperationretrieve?forum=AzureFunctions –

+0

Bitte aktualisieren Sie die Paket-Referenz für * * WindowsAzure.Storage ** von Version 4.3 auf 7.0. – mathewc

1

Mit der aktuellen Version von Funktionen konnte ich Zeilenaktualisierungen mit deklarativen Bindungen arbeiten. Hier ist ein Beispiel mit HTTP-Trigger, der eine Zahl in der Azure-Tabellenzeile erhöht.

function.json:

{ 
    "bindings": [ 
    { 
     "authLevel": "function", 
     "name": "req", 
     "type": "httpTrigger", 
     "direction": "in", 
     "route": "HttpTriggerTableUpdate/{partition}/{rowkey}" 
    }, 
    { 
     "name": "$return", 
     "type": "http", 
     "direction": "out" 
    }, 
    { 
     "type": "table", 
     "name": "inputEntity", 
     "tableName": "SOTrial", 
     "partitionKey": "{partition}", 
     "rowKey": "{rowkey}", 
     "connection": "my_STORAGE", 
     "direction": "in" 
    }, 
    { 
     "type": "table", 
     "name": "outputEntity", 
     "tableName": "SOTrial", 
     "partitionKey": "{partition}", 
     "rowKey": "{rowkey}", 
     "connection": "my_STORAGE", 
     "direction": "out" 
    } 
    ], 
    "disabled": false 
} 

C# Funktion:

#r "Microsoft.WindowsAzure.Storage" 

using System; 
using System.Net; 
using Microsoft.WindowsAzure.Storage.Table; 

public class Entity : TableEntity 
{ 
    public int Number {get; set;} 
} 

public static HttpResponseMessage Run(HttpRequestMessage req, string partition, 
    string rowkey, Entity inputEntity, out Entity outputEntity) 
{ 
    if (inputEntity == null) 
     outputEntity = new Entity { PartitionKey = partition, RowKey = rowkey, Number = 1}; 
    else 
    { 
     outputEntity = inputEntity; 
     outputEntity.Number += 1; 
    } 

    return req.CreateResponse(HttpStatusCode.OK, $"Done, Number = {outputEntity.Number}"); 
} 
+0

Leider konnte ich diese Technik nicht für Knoten verwenden. –

+0

Ich habe das Problem unter https://github.com/Azure/azure-webjobs-sdk-script/issues/1663 gemeldet –